-
QDialog的显示有两个函数show()和exec()。他们的区别在参考文档上的解释如下:
- show():显示一个非模式对话框。控制权即刻返回给调用函数。
- exec():显示一个模式对话框,并且锁住程序直到用户关闭该对话框为止。
-
模态对话框(不可以对其他窗口进行操作) 非模态对话框(可以对其他窗口进行操作)
下方代码,创建了模态和非模态对话框,并有详细注释,仔细阅读就能明白
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//1.模态创建 阻塞
connect(ui->myBtn1,&QPushButton::clicked,[=](){
QDialog dia(this);// 把当前窗口设为父窗口,
dia.resize(200,200);// 如果不设置大小,窗口就会很小,就会有一个警告
dia.exec();// 阻塞显示
// 当窗口关闭的时候,这句话才会打印出来
qDebug() << "模态对话框";
});
//1.非模态创建 不阻塞阻塞
connect(ui->myBtn2,&QPushButton::clicked,[=](){
/*因为是不阻塞窗口所以就会往下运行,若在栈上创建非模态,
当这个函数运行完就会自动销毁,窗口只会一闪而过,
所以要在堆上创建,避免多次创建对话框开关开关...导致内存得不到释放
那么就要给对话框设置一个属性,此对话框关闭后资源自动释放*/
// QDialog dia(this);
QDialog* dia = new QDialog(this);
dia->setAttribute(Qt::WA_DeleteOnClose);// 窗口关闭的时候就会释放窗口资源
dia->resize(200,200);// 如果不设置大小,窗口就会很小,就会有一个警告
dia->show();// 不阻塞阻塞显示
// 窗口被创建后,这句话紧接着就打印出来
qDebug() << "非模态对话框";
});
}