一、概念介绍
什么是模态对话框和非模态对话框呢?我们日常使用软件过程中很常见的现象,点击某个软件上某个按钮会弹出对话框窗口,此时对于其他窗口而言:
- 可以同时对其他窗口进行操作的称为非模态;
- 不可以同时,只能操作当前弹出的窗口的称为模态。
二、代码示例
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
:显示操作过程。
分享微信公众号『设计至纯』,查看更多原创内容,O(∩_∩)O一键三连🤳、分享😍、收藏、点赞、支持🐱🚀。 ^ o ^ 您的点赞、评论和关注,是小小编继续创作的不懈动力。 😀
转载:https://blog.csdn.net/caq_jw/article/details/115360742
查看评论