1、模态说明
模态:
启动模态界面时,例如弹出对话框强制用户从其他正在进行的业务中聚焦到当前对话框,除了该对话框整个应用程序窗口都无法接受用户响应,无法切换界面,无法切换当前Qt应用。这可以保证用户按照自己设计的操作逻辑进行动作。只有关闭和退出该模态界面,才可以访问本应用程序的其他界面和功能。
非模态:
与模态相反,默认状态为非模态,即可以随意切换,可以在同一应用下的各个窗口界面任意切换。
半模态:
介于二者之间,冻结窗口界面,但其他应用继续执行响应。
所以,如果是dialog窗体,需要在exec以后还能让其他代码继续执行,需要在dialog窗体exec前执行
setWindowModality
函数设置窗口为半模态或非模态,否则会阻塞其他窗体消息。
类型 | 模态 | 非模态 | 半模态 |
---|---|---|---|
实现 | exec() | show() | setModal(true) + show() |
运行阻塞 | 是 | 否 | 否 |
其他界面操作 | 否 | 是 | 否 |
2、枚举定义
-
Qt::NonModal
非模态:正常模式 -
Qt::WindowModal
半模态:窗口级模态对话框,阻塞父窗口、父窗口的父窗口及兄弟窗口。 -
Qt::ApplicationModal
模态:应用程序级模态对话框,阻塞整个应用程序的所有窗口。
3、使用
(2)模态
QDialog dialog;
dialog.exec(); //窗口阻塞运行
(2)非模态
QDialog dialog; //不能是局部变量,非模态为非阻塞运行,否则窗口离开作用域就被释放了
dialog.setWindowModality(Qt::WindowModal);
dialog.show();
(3)半模态
QDialog dialog; //不能是局部变量,半模态为非阻塞运行,否则窗口离开作用域就被释放了
dialog.setWindowModality(Qt::WindowModal);
//上句话或者使用dialog.setmodal(true);
dialog.show();
4、效果
(1)模态效果:点击按钮出现dialog弹窗后,dialog弹窗一直保持最前,主界面将不被响应,点击无效,只有弹窗关闭后才恢复。
(2)半模态效果:点击按钮出现dialog弹窗后,主窗口依旧能够响应鼠标及聚焦,只是dialog弹窗不能保持最前,聚焦主窗口后,主窗口在dialog弹窗前显示。