ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:50.74KB ,
资源ID:11315304      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11315304.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Qt基础教程之MDI及其使用方法.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Qt基础教程之MDI及其使用方法.docx

1、Qt基础教程之MDI及其使用方法传统的应用程序设计中有多文档界面(Multi-document Interface,MDI)应用程序,Qt为设计 MDI 应用程序提供了支持。本节的实例中是一个 MDI 应用程序,程序运行效果如图 1 所示。图 1 MDI 应用程序实例的运行时界面MDI 应用程序就是在主窗口里创建多个同类型的 MDI 子窗口,这些 MDI 子窗口在主窗口里显示,并共享主窗口上的工具栏和菜单等操作功能,主窗口上的操作都针对当前活动的 MDI 子窗口进行。 设计 MDI 应用程序需要在主窗口工作区放置一个 QMdiArea 作为子窗体的容器。实例 samp6_4 主窗口的工作区使用

2、一个 QMdiArea 组件,实例的子窗口类是 QFormDoc,是一个使用 QPlainTextEdit 进行简单文本显示和编辑的窗体。创建的 QFormDoc 窗体对象作为一个子窗口加入到 mdiArea 组件中。QMdiArea 组件类似于实例 samp6_3 中主窗口上的 tabWidget 组件,只是 QMdiArea 提供更加完备的功能。更改 MDI 的显示模式,可以得到与实例 samp6_3 相似的以多页组件管理的 MDI 界面效果。文档窗口类QFormDoc的设计以可视化方式创建一个基于 QWidget 的类 QFormDoc,设计可视化界面时,只放置一个 QPlainText

3、Edit 组件,并以水平布局填充满整个窗口。这里不再用可视化的方式设计 Action,因为 QFormDoc 窗口不需要创建自己的工具栏,而是使用主窗口上的工具栏按钮对 QFormDoc 窗体上的 QPlainTextEdit 组件进行操作。为 QFormDoc 添加一些用于文件打开和编辑操作的接口函数,QFormDoc 类的完整定义如下:1. class QFormDoc : public QWidget2. 3. Q_OBJECT4. private:5. QString mCurrentFile; /当前文件6. bool mFileOpened=false; /文件已打开7. publ

4、ic:8. explicit QFormDoc(QWidget *parent = 0);9. QFormDoc();10. void loadFromFile(QString& aFileName); /打开文件11. QString currentFileName();/返回当前文件名12. bool isFileOpened();/文件已经打开13. void setEditFont();/设置字体14. void textCut(); /cut15. void textCopy(); /copy16. void textPaste(); /paste17. private:18. Ui

5、:QFormDoc *ui;19. ;这些接口函数是为了在主窗口里调用,实现对 MDI 子窗口的操作。实现代码如下:1. QFormDoc:QFormDoc(QWidget *parent) :2. QWidget(parent),3. ui(new Ui:QFormDoc)4. 5. ui-setupUi(this);6. 7. this-setWindowTitle(New Doc); /窗口标题8. this-setAttribute(Qt:WA_DeleteOnClose); /关闭时自动删除9. 10. 11. QFormDoc:QFormDoc()12. 13. /QMessage

6、Box:information(this,信息,文档窗口被释放);14. delete ui;15. 16. 17. void QFormDoc:loadFromFile(QString &aFileName)18. /打开文件19. QFile aFile(aFileName); /以文件方式读出20. if (aFile.open(QIODevice:ReadOnly | QIODevice:Text) /以只读文本方式打开文件21. 22. QTextStream aStream(&aFile); /用文本流读取文件23. ui-plainTextEdit-clear();/清空24.

7、ui-plainTextEdit-setPlainText(aStream.readAll(); /读取文本文件25. aFile.close();/关闭文件26. mCurrentFile=aFileName;/保存当前文件名27. QFileInfo fileInfo(aFileName); /文件信息28. QString str=fileInfo.fileName(); /去除路径后的文件名29. this-setWindowTitle(str);30. mFileOpened=true;31. 32. 33. 34. QString QFormDoc:currentFileName(

8、)35. 36. return mCurrentFile;37. 38. 39. bool QFormDoc:isFileOpened()40. /文件是否已打开41. return mFileOpened;42. 43. 44. void QFormDoc:setEditFont()45. 46. QFont font;47. font=ui-plainTextEdit-font();48. 49. bool ok;50. font=QFontDialog:getFont(&ok,font);51. ui-plainTextEdit-setFont(font);52. 53. 54. voi

9、d QFormDoc:textCut()55. 56. ui-plainTextEdit-cut();57. 58. 59. void QFormDoc:textCopy()60. 61. ui-plainTextEdit-copy();62. 63. 64. void QFormDoc:textPaste()65. 66. ui-plainTextEdit-paste();67. 注意作为 MDI 子窗口,不管其是否设置为关闭时删除,在主窗口里关闭一个 MDI 子窗口时,都会删除子窗口对象。MDI 主窗口设计与子窗口的使用主窗口界面设计要在主窗口实现 MDI 功能,只需在主窗口的工作区放置一

10、个 QMdiArea 组件。图 2 是设计好的主窗口界面。图 2 设计时的主窗口在 UI 设计器里创建 Action,并应用 Action 设计主工具栏。在主窗口的工作区放置一个 QMdiArea 组件,然后在主窗口的构造函数里设置 mdiArea 填充满工作区。1. QWMainWindow:QWMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui:QWMainWindow)2. 3. ui-setupUi(this);4. this-setCentralWidget(ui-mdiArea);5. this-setWindo

11、wState(Qt:WindowMaximized);6. ui-mainToolBar-setToolButtonStyle(Qt:ToolButtonTextUnderlcon);7. MDI 子窗口的创建与加入下面是主窗口上“新建文档”按钮的响应代码:1. void QWMainWindow:on_actDoc_New_triggered()2. /新建文档3. QFormDoc *formDoc = new QFormDoc(this);4. ui-mdiArea-addSubWindow (formDoc) ; /文档窗口添力口到 MDI formDoc-show();5. 代码功能

12、是新建一个 QFormDoc 类的窗口 formDoc,构造函数中传入了主窗口指针,所以主窗口是 formDoc 的父窗口,然后使用 QMdiArea 的 addSubWindow() 函数将 formDoc 加入到 mdiArea。下面是主窗口上“打开文档”按钮的响应代码:1. void QWMainWindow:on_actDoc_Open_triggered()2. /打开文件3. /必须先获取当前MDI子窗口,再使用打开文件对话框,否则无法获得活动的子窗口4. bool needNew=false;/ 是否需要新建子窗口5. 6. QFormDoc *formDoc;7. if (ui

13、-mdiArea-subWindowList().count()0) /如果有打开的主窗口,获取活动窗口8. 9. formDoc=(QFormDoc*)ui-mdiArea-activeSubWindow()-widget();10. needNew=formDoc-isFileOpened();/文件已经打开,需要新建窗口11. 12. else13. needNew=true;14. 15. QString curPath=QDir:currentPath();16. QString aFileName=QFileDialog:getOpenFileName(this,tr(打开一个文件

14、),curPath,17. C程序文件(*.h *cpp);文本文件(*.txt);所有文件(*.*);18. if (aFileName.isEmpty()19. return; /如果未选择文件,退出20. 21. if (needNew) /需要新建子窗口22. 23. formDoc = new QFormDoc(this);/指定父窗口,必须在父窗口为Widget窗口提供一个显示区域24. ui-mdiArea-addSubWindow(formDoc);25. 26. 27. formDoc-loadFromFile(aFileName); /打开文件28. formDoc-sho

15、w();29. 30. ui-actCut-setEnabled(true);31. ui-actCopy-setEnabled(true);32. ui-actPaste-setEnabled(true);33. ui-actFont-setEnabled(true);34. 通过 QMdiArea:subWindowList() 可以获得子窗口对象列表,从而可以判断子窗口的个数。如果没有一个MDI子窗口,就创建一个新的窗口并打开文件。如果有 MDI 子窗口,则总有一个活动窗口,通过 QMdiArea:activeSubWindow() 可以获得此活动的子窗口,通过子窗口的 isFileOp

16、ened() 函数判断是否打开了文件,如果没有打开过文件,就在这个活动窗口里打开文件,否则新建窗口打开文件。注意一定要先获取 MDI 子窗口,再使用 QFileDialog 选择需要打开的文件。如果顺序更换了,则无法获得正确的 MDI 活动子窗口。QMdiArea常用功能函数QMdiArea 提供了一些成员函数,可以进行一些操作,工具栏上的“关闭全部”、“MDI模式”、“级联展开”、“平铺展开”等按钮都是调用 QMdiArea 类的成员函数实现的。下面是这几个按钮功能的实现代码:1. void QWMainWindow:on_actCascade_triggered()2. /窗口级联展开3.

17、 ui-mdiArea-cascadeSubWindows();4. 5. 6. void QWMainWindow:on_actTile_triggered()7. /平铺展开8. ui-mdiArea-tileSubWindows();9. 10. 11. void QWMainWindow:on_actCloseALL_triggered()12. /关闭全部子窗口13. ui-mdiArea-closeAllSubWindows();14. 15. void QWMainWindow:on_actViewMode_triggered(bool checked)16. /MDI 显示模式

18、17. if (checked) /Tab多页显示模式18. 19. ui-mdiArea-setViewMode(QMdiArea:TabbedView); /Tab多页显示模式20. ui-mdiArea-setTabsClosable(true); /页面可关闭21. ui-actCascade-setEnabled(false);22. ui-actTile-setEnabled(false);23. 24. else /子窗口模式25. 26. ui-mdiArea-setViewMode(QMdiArea:SubWindowView); /子窗口模式27. ui-actCascad

19、e-setEnabled(true); /28. ui-actTile-setEnabled(true); /29. 30. 其中,设置 MDI 视图模式用 setViewMode() 函数,有两种模式可以选择:1. QMdiArea:Sub Window View 是传统的子窗口模式,显不效果如图 1 所示。2. QMdiArea:TabbedView 是多页的显示模式,显示效果如图 3 所示。图 3 多页模式下 MDI 界面MDI的信号QMdiArea 有一个信号 subWindowActivated(QMdiSubWindow *argl),在当前活动窗口切换时发射,利用此信号可以在活动

20、窗口切换时进行一些处理,例如,在状态栏里显示活动 MDI 子窗口的文件名,在没有 MDI 子窗口时,将工具栏上的编辑功能按钮设置为禁用。下面是该信号的槽函数代码:1. void QWMainWindow:on_mdiArea_subWindowActivated(QMdiSubWindow *arg1)2. /当前活动子窗口切换时3. if (ui-mdiArea-subWindowList().count()=0)4. /若子窗口个数为零5. ui-actCut-setEnabled(false);6. ui-actCopy-setEnabled(false);7. ui-actPaste-

21、setEnabled(false);8. ui-actFont-setEnabled(false);9. ui-statusBar-clearMessage();10. 11. else12. 13. QFormDoc *formDoc=static_cast(ui-mdiArea-activeSubWindow()-widget();14. ui-statusBar-showMessage(formDoc-currentFileName(); /显示主窗口的文件名15. 16. 主窗口工具栏上的“剪切”、“复制”、“粘贴”、“字体设置”等按钮都是调用当前子窗口的相应函数,关键是获取当前 MD

22、I 子窗体对象。例如,“剪切”和“字体设置”按钮的代码如下:1. void QWMainWindow:on_actCut_triggered()2. /cut3. QFormDoc* formDoc=(QFormDoc*)ui-mdiArea-activeSubWindow()-widget();4. formDoc-textCut();5. 6. void QWMainWindow:on_actFont_triggered()7. /设置字体8. QFormDoc* formDoc=(QFormDoc*)ui-mdiArea-activeSubWindow()-widget();9. formDoc-setEditFont();10.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1