目录
一、模态对话框
模态对话框弹出以后不可以对其他的窗口进行操作,不把它关了就无法操作其他的窗口。不过无法操作的是与它“一家”的窗口,对于一些与它没关系的窗口还是可以操作的。
connect(ui->actionmodal,&QAction::triggered,[=](){
//创建一个模态对话框
QDialog dlg(this);
//设置对话框的名称
dlg.setWindowTitle("模态对话框");
//设置对话框的大小
dlg.resize(200,100);
//显示模态对话框
dlg.exec();
qDebug() << "模态对话框关闭";
});
模态对话框一旦弹出,代码就不会再往下执行了,所以只有关闭模态对话框后qDebug的内容才会输出出来。
二、非模态对话框
与模态对话框正好相反,非模态对话框弹出后仍然可以对其他的对话框进行操作。
connect(ui->actionnotmodal,&QAction::triggered,[=](){
//创建一个非模态对话框
QDialog * dlg = new QDialog(this);
//设置对话框的名称
dlg->setWindowTitle("非模态对话框");
//设置对话框的大小
dlg->resize(200,100);
//显示非模态对话框
dlg->show();
qDebug() << "非模态对话框弹出";
});
需要注意的是非模态对话框创建后最好将其释放,否则会造成内存浪费。使用setAttribute()函数,其中的Qt::WA_DeleteOnClose参数所代表的意思就是在dlg对话框关闭的时候自动将其内存释放,这样就不用担心关闭后的对话框再占用内存了。
三、两者异同
模态对话框与非模态对话框其实都是对话框,两者的区别主要在于调用的方式不同。如果使用exec()弹出对话框就是模态对话框,代码阻塞到这里无法往下执行,无法调用函数响应对其他对话框的操作了,自然也就无法操作其他对话框了。用show()弹出对话框就是非模态对话框,不影响代码往下执行,这样也就可以操作其他对话框了。在上面的代码中都有设置对话框的名称和大小的代码。如果不设置对话框的名称,默认使用的是项目名称,影响不大。如果不重置大小的话,虽然代码可以运行,但是会发出警告,应为对话框的大小有一个最小值,小于这个值就会发出警告。