Qt专栏之模态与非模态对话框的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qt专栏之模态与⾮模态对话框的实现
⼀、概念介绍
什么是模态对话框和⾮模态对话框呢?我们⽇常使⽤软件过程中很常见的现象,点击某个软件上某个按钮会弹出对话框窗⼝,此时对于其他窗⼝⽽⾔:
可以同时对其他窗⼝进⾏操作的称为⾮模态;
不可以同时,只能操作当前弹出的窗⼝的称为模态。
⼆、代码⽰例
2.1模态对话框⽰例代码
/*在主类对象的构造函数中我们新建⼀个按钮⽤于弹出对话框*/
QPushButton *btn = new QPushButton("new",this);
/*信号与槽的连接
槽函数通过Lambda表达式实现
主要功能实现了点击⼀个new按钮,弹出⼀个模态对话框
*/
connect(btn,&QPushButton::clicked,[=](){
QDialog dlg(this) ;
dlg.exec();
});
注意包含头⽂件QPushButton以及QDialog
2.2⾮模态对话框⽰例代码
/*在主类对象的构造函数中我们新建⼀个按钮⽤于弹出对话框*/
QPushButton *btn = new QPushButton("new",this);
/*信号与槽的连接,槽函数通过Lambda表达式实现
主要功能实现了点击⼀个new按钮,弹出⼀个⾮模态对话框
*/
connect(btn,&QPushButton::clicked,[=](){
QDialog *dlg = new QDialog(this) ;
dlg->show();
});
很好奇,为什么是对话框,上⾯模态直接QDialog dlg(this);⽽⾮模态就需要new呢?那是因为构造函数中在栈中声明定义的变量在构造函数运⾏完成后,就会被回收。
因此,new⼀个对象实例,利⽤堆上的空间即可,可以试试两种实现效果的不同,这边我们演⽰的效果如下:
三、⾮模态下的内存泄漏隐患
假设⼀下,在我们上述的⾮模态场景下,点击按钮new⼀个对象⽰例后,我们关掉对话框,由于使⽤堆空间,只要主窗⼝QObject未被析构回收内存,继续点击按钮就会⼜创建⼀个新的对象实例,循环反复⼀直创建到达⼀定数量级,就会导致堆溢出。
解决办法就是使⽤setAttribute()设置属性函数,设置属性值Qt::WA_DeleteOnClose,意思就是当弹出的⾮模态对话框关闭,既删除该对象内存,以上⾯的例⼦添加如下代码:
dlg->setAttribute(Qt::WA_DeleteOnClose);
四、标准对话框
标准对话框:Qt内置了⼀系列对话框,⽤于简化开发。
事实上,有很多对话框都是通⽤的,⽐如打开⽂件、设置颜⾊、打印设置等。
这些对话框在所有程序中⼏乎相同,因此没有必要在每⼀个程序中都⾃⼰实现这么⼀个对话框。
Qt 的内置对话框⼤致分为以下⼏类:
QColorDialog:选择颜⾊;
QFileDialog:选择⽂件或者⽬录;
QFontDialog:选择字体;
QInputDialog:允许⽤户输⼊⼀个值,并将其值返回;
QMessageBox:模态对话框,⽤于显⽰信息、询问问题等;
QPageSetupDialog:为打印机提供纸张相关的选项;
QPrintDialog:打印机配置;
QPrintPreviewDialog:打印预览;
QProgressDialog:显⽰操作过程。
到此这篇关于Qt专栏之模态与⾮模态对话框的实现的⽂章就介绍到这了,更多相关Qt 模态与⾮模态对话框内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。