Qt多文档界面应用设计

使用Qt编写多文档界面(MDI)应用相当方便,主要会使用到QMdiArea和QMdiSubWindow两个类。可以查看Qt Asistant中这两个类的说明文档,里面介绍的相当详细。另外,可以搜索例程"Mdi Example",这是提供的一个示例程序,这是一个多文档编辑器,代码很详细,只是缺少注释,不过很简单,应该容易看懂。接下来,我在这里介绍最简单、最精华的部分。

1 QMdiArea

这个类相当于一个MDI窗口管理器,用来管理添加到这个区域中的多个子窗口。我们在应用中新建的所有子窗口都需要通过addSubWindow()方法添加到其中。一般情况下,QMdiArea被用作QMainWindow的中央部件,但是,你也可以将它添加到任意的布局中。下面的代码就是将其添加到中央部件:

1 QMainWindow *mainWindow = new QMainWindow;
2 mainWindow->setCentralWidget(mdiArea);

2 QMdiSubWindow

  这个类继承自QWidget,主要用来创建MDI子窗体实例。然后,可以通多调用QMdiArea的addSubWindow()方法将新建的子窗体实例添加到多文档界面区域。当然,我们也可以不用QMdiSubWindow类来创建子窗体,而直接使用继承自QWidget的类,比如下面的代码:

1 void MainWindow::actNewWindow()
2 {
3     QLabel *label = new QLabel;
4     m_mdiArea->addSubWindow(label);
5     label->show();
6 }

  不过,使用QMdiSubWindow类的话,我们可以使用其提供的一些方便的成员方法,详细内容请参看帮助手册,下面给出一段示例代码:

1 void MainWindow::actNewWindow()
2 {
3     QLabel *label = new QLabel;
4     QMdiSubWindow *subWin = new QMdiSubWindow;
5     subWin->setWidget(label);
6     subWin->setAttribute(Qt::WA_DeleteOnClose);
7     m_mdiArea->addSubWindow(subWin);
8     subWin->show();
9 }

3 示例程序

最后,再给出一个简单的应用示例。这个代码中,我们使用最简单的Qt向导创建一个QMainWindow应用。然后,在菜单中添加一个“New”菜单项,用来每次创建一个子窗体,并显示在MDI区域。每个子窗体就是一个QLabel部件,用来显示一个标签。构造函数代码如下:

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3
 4 MainWindow::MainWindow(QWidget *parent) :
 5     QMainWindow(parent),
 6     ui(new Ui::MainWindow)
 7 {
 8     ui->setupUi(this);
 9
10     //Create a MDI Area
11     m_mdiArea = new QMdiArea;
12     this->setCentralWidget(m_mdiArea);
13
14     connect(ui->actionNew, SIGNAL(triggered()), this, SLOT(actNewWindow()));
15 }

对应的新建子窗体槽函数定义如下:

1 void MainWindow::actNewWindow()
2 {
3     QLabel *label = new QLabel(tr("MDI SubWindow!"));
4     QMdiSubWindow *subWin = new QMdiSubWindow;
5     subWin->setWidget(label);
6     subWin->setAttribute(Qt::WA_DeleteOnClose);
7     m_mdiArea->addSubWindow(subWin);
8     subWin->show();
9 }

程序运行效果如下:

时间: 2024-10-08 16:54:06

Qt多文档界面应用设计的相关文章

设计一个多文档界面(MDI)应用程序,可以实现打开、排列和关闭子窗口。

首先 :我们要知道什么是多文档界面(MDI) 理论上说是"在多文档窗口环境下进行开发设计的,这种多文档界面称为多文档界面(mdi)" 通俗 的一点,我们最常见到的Excel表格就是mdi [我个人理解的图是这样的] 开始实际操作: 1.打开2个窗体[Form2为主窗体,Form2_son为子窗体] 2.在主窗体Form2中拖拉控件 MenuStrip(菜单栏) 设置form2的IsMdiContainer=True 3.在子窗体Form2_son中拖拉控件 RichTextBox  (

多文档界面的实现(DotNetBar的superTabControl)

private void FormMain_Load(object sender, EventArgs e) { superTabControl2.Tabs.Clear(); timer1.Start(); buttonX1_Click(null, null); } /// <summary> /// 创建或者显示一个多文档界面 /// </summary> /// <param name="caption">窗体标题</param> /

【Windows编程】系列第十一篇:多文档界面框架

前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典型的多文档界面,他可以同时编辑多个文档,每个文档还可以最大化,最小化等等,我们今天就来看看多文档的基本框架是怎么实现的. 多文档界面的框架创建需要几下几步. 主框架窗口创建 主框架窗的创建跟普通的窗口没有什么区别,就是自己注册一个类并用该类创建一个重叠窗口,这个可以用CreateWindow/Cre

分享JAVA从初级程序员到架构师视频,文档,架构设计,大型网站架构分析,大数据分析资料

JAVA从初级程序员到架构师视频,文档,架构设计,大型网站架构分析,大数据分析资料, 搭建高并发.高可用电商架构设计资料需要的联系我.很多目录都没列出来(QQ空间相册里有很多目录的截图)加QQ:1927360914

多文档界面QMdiArea

当使用多文档界面功能时,我们是将QMdiArea作为主窗口的中央部件,然后在这个中央部件中,我们可以同时打开很多个子窗口QMdiSubWindow 样式: 1 import sys 2 from PyQt5.QtGui import QIcon 3 from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QAction, QTextEdit 4 5 6 class Demo(QMainWind

Qt多文档实现屏幕空间(类似监控多画面)效果

Qt多文档程序中的每一个子窗口就是一个个的画面,子窗口可以自由拖动,激活来使用.现实中,类似于监控的多画面同时排列显示比较常见,也比较实用.实现思路:1.响应窗口的resizeEvent事件2.根据分割数目,通过setGeometry动态设置子窗口相对位置代码如下: 1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 6 class QMdiArea; 7 class QMdiSubWindow;

第19章 多文档界面

19.1 概述——MDI层次结构 ①框架窗口 A.本身是一个普通的主窗口,其客户区被特殊的窗口覆盖,并不直接显示程序的输出.其客户区也被称为“工作区” B.默认的消息处理函数是DefFrameProc,而不是DefWindowProc. ②客户窗口: A.系统预定义的窗口类,类名“MDICLIENT”,负责各个MDI子窗口的管理. B.窗口过程系统己经预先注册,用户程序不需要窗口过程. ③文档窗口:也称为子窗口,用于显示一个文档. 19.2 窗口的建立 (1)框架窗口:先注册一个MDI框架窗口类

DotNetBar创建的Ribbon、标签式多文档界面

1.创建一个form作为主窗体,继承自:DevComponents.DotNetBar.RibbonForm 设置属性:IsMdiContainer为true 2.创建一个form,作为子窗体,也继承自:DevComponents.DotNetBar.RibbonForm,插入一个richtext控件,dock=fill 3.主窗体插入一个DevComponents.DotNetBar.TabStrip,作为控制各个子窗体的标签显示器 设置属性: CloseButtonOnTabsVisible

C# Winfrom MDI(多文档界面)

1.首先设置父级Form1界面,只需要将该界面的IsMdiContainer属性设置为true: 2.设置按钮的事件来打开子级的窗口Form2,Form3等等: 3.在From1内设置一个容器panel,范围为需要打开的子级界面的大小: 4.设置Form2.Form3的事件,以及唯一窗口等: //Form2的点击事件 private void form2ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 f2 = new For