Qt基础-模态与非模态窗口
在Qt中,QDialog是所有对话框窗口类的基类,不只是对话框有模态与非模态区分,QWidget和QMainWindow窗口也可以设为模态,因此文章不称模态/非模态对话框,而叫做模态/非模态窗口。
模态与非模态的区别
模态(modal)窗口:窗口弹出后,没关闭之前,不可以对同一应用程序的其他窗口进行操作;
非模态(modeless)窗口:窗口弹出后,没关闭之前,可以对同一应用程序的其他窗口进行操作,可以同时和多个窗口进行交互;
模态窗口的实现方法
窗口的show()函数显示的类型是非模态的,有几种方法可以将窗口设为模态,如下:
QDialog对话框
- 方法1:exec()
QDialog dlg(this);
dlg.exec();
– 说明:exec是execute(执行)的缩写,当调用exec()函数时,并不会立即返回,只用当对话框关闭才会返回,因此,只有关闭对话框才会执行后续的代码。
- 方法2:setModal()
QDialog dlg(this);
dlg.setModal(true); //相当于dlg.setWindowModality(Qt::ApplicationModal);
dlg.show();
- 说明:设置完模态之后,会执行后续的代码,并不会阻塞。
- 方法3:setWindowModality()
QDialog dlg(this);
dlg.setWindowModality(Qt::ApplicationModal);
dlg.show();
- 说明:setWindowModality()的参数设置要阻塞的窗口类型:
枚举值 | 值 | 说明 |
---|---|---|
Qt::NonModal | 0 | 非模态,不阻塞任何窗口 |
Qt::WindowModal | 1 | 模态,阻塞它的父窗口、所有的祖先窗口以及他们的子窗口 |
Qt::NonModal | 2 | 模态,阻塞应用程序所有的窗口 |
QWidget和QMainWindow窗口
这两种窗口的模态实现只有上述QDialog中的方法3,即setWindowModality(),不再赘述。
设置置顶非模态窗口
有子窗口和父窗口,要实现子窗口置顶,但是可以对父窗口进行操作,可以在父窗口中进行设置:
subDlg->setParent(this,Qt::Window);