MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操作都在这个容器内进行,如下我们将具体介绍该组件的常用使用技巧。 MDI窗体控件类似于画布,该控件只具备展示窗体的功能,无法实现生成窗体,所以我们需要在项目中手动增加自定义的Dialog对话框,并对该对话框进行一定的定制。 这个Dialog对话框我们只增加两个功能,一个Dialog::currentFileName()获取窗体标题,另一个Dialog::SetData(QStringdata)设置数据到编辑框,代码实现如下。includedialog。hincludeuidialog。hDialog::Dialog(QWidgetparent):QDialog(parent),ui(newUi::Dialog){uisetupUi(this);thissetWindowTitle(NewDocBy:LyShark);窗口标题thissetAttribute(Qt::WADeleteOnClose);关闭时自动删除thissetFixedSize(200,100);设置窗体大小thissetWindowIcon(QIcon(:image1。ico));}Dialog::Dialog(){deleteui;}获取窗体标题By:LySharkQStringDialog::currentFileName(){QStringtitlethiswindowTitle();returntitle;}设置编辑框内容https:www。cnblogs。comlysharkvoidDialog::SetData(QStringdata){uilineEditsetText(data);} 接着我们开始绘制这个程序的主界面,在toolBar中增加相应的菜单栏,并在主窗体中放入mdiArea容器组件。 窗体中的顶部菜单栏,我们需要手动定义一下他们所具备的功能名称等。 当程序启动后,程序调用MainWindow初始化这个窗体,初始化代码如下:includemainwindow。hincludeuimainwindow。hincludedialog。hincludeiostreamincludeQCloseEvent如果直接关闭,则清空所有对话框https:www。cnblogs。comlysharkvoidMainWindow::closeEvent(QCloseEventevent){uimdiAreacloseAllSubWindows();eventaccept();}By:LySharkMainWindow::MainWindow(QWidgetparent):QMainWindow(parent),ui(newUi::MainWindow){uisetupUi(this);thissetCentralWidget(uimdiArea);thissetWindowState(Qt::WindowMaximized);窗口最大化显示uimainToolBarsetToolButtonStyle(Qt::ToolButtonTextUnderIcon);uimdiAreasetViewMode(QMdiArea::SubWindowView);子窗口模式}MainWindow::MainWindow(){deleteui;} 代码运行效果如下: 用户新建窗体执行MainWindow::onactionOpentriggered()事件,关闭窗体时则执行MainWindow::onactionClosetriggered()事件。新建窗体voidMainWindow::onactionOpentriggered(){DialogformDocnewDialog(this);uimdiAreaaddSubWindow(formDoc);文档窗口添加到MDIformDocshow();在单独的窗口中显示}关闭全部voidMainWindow::onactionClosetriggered(){uimdiAreacloseAllSubWindows();关闭所有子窗口} 代码运行效果如下: 当用户点击MDI模式时,我们则执行以下代码,将所有已存在的窗体合并为一个类似于TabWidget的窗体组件。转为MID模式voidMainWindow::onactionMIDtriggered(boolchecked){Tab多页显示模式if(checked){uimdiAreasetViewMode(QMdiArea::TabbedView);Tab多页显示模式uimdiAreasetTabsClosable(true);页面可关闭uiactionLinesetEnabled(false);uiactionTilesetEnabled(false);}子窗口模式else{uimdiAreasetViewMode(QMdiArea::SubWindowView);子窗口模式uiactionLinesetEnabled(true);uiactionTilesetEnabled(true);}} 代码运行效果如下: 窗体级联模式则是将窗体并排排列在一起,我们只需要调用uimdiAreacascadeSubWindows();方法即可实现。级联模式voidMainWindow::onactionLinetriggered(){uimdiAreacascadeSubWindows();} 代码运行效果如下: 平铺模式同样使用uimdiAreatileSubWindows();即可实现转换。平铺模式voidMainWindow::onactionTiletriggered(){uimdiAreatileSubWindows();} 代码运行效果如下: 最后一个功能是主窗体发送数据到子窗体,该功能的实现需要两个函数。onmdiAreasubWindowActivated实现设置主窗体名字到自身onactionSendMsgtriggered实现主窗体发送消息到子窗体内当子窗体打开时获取到其窗体标题By:LySharkvoidMainWindow::onmdiAreasubWindowActivated(QMdiSubWindowarg1){QUNUSED(arg1);若子窗口个数为零,则将statusBar置空if(uimdiAreasubWindowList()。count()0){uistatusBarclearMessage();}else{如果不为0则显示主窗口的文件名DialogformDocstaticcastDialog(uimdiAreaactiveSubWindow()widget());uistatusBarshowMessage(formDoccurrentFileName());}}对选中窗体发送数据https:www。cnblogs。comlysharkvoidMainWindow::onactionSendMsgtriggered(){先获取当前MDI子窗口DialogformDoc;如果打开则获取活动窗体if(uimdiAreasubWindowList()。count()0){formDoc(Dialog)uimdiAreaactiveSubWindow()widget();对活动窗体设置数据formDocSetData(hellolyshark);}} 代码运行效果如下: 文章作者:lyshark(王瑞) 文章出处:https:www。cnblogs。comLySharkp15624618。html