Qt::WindowModal和Qt::ApplicationModal都是弹出模态窗体,但是Qt::WindowModal和Qt::ApplicationModal的模态影响的范围不同。
- Qt::WindowModal 在Qt帮助文档中的解释如下:
The window is modal to a single window hierarchy and blocks input to its parent window, all grandparent windows, and all siblings of its parent and grandparent windows.
意思是说:设置为 Qt::WindowModal标志窗体的模态特性仅仅是作用于本窗体所在的继承层次所在窗体,当本窗体弹出时,如果用户不响应本窗体,则本窗体的父窗体、上层的多个祖先窗体、本窗体的兄弟窗体及兄弟窗体的父窗体及其上层的多个祖先窗体的输入、响应都会被阻塞、挂起,也就是说Qt::WindowModal标志只波及到本窗体的继承层次上。
- Qt::ApplicationModal在Qt帮助文档中的解释如下:
The window is modal to the application and blocks input to all windows.
意思是说:设置为 Qt::ApplicationModal标志窗体的模态特性作用在整个应用程序级别。只要本窗体得不到用户响应,则该应用程序所有其它窗体,用户都无法操作,即其它窗体都不响应用户的输入操作(如:键盘、鼠标操作)。
说白了, Qt::ApplicationModal范围更广,涉及到整个应用程序范围;Qt::WindowModal标志只波及到本窗体的继承层次上。我们常用的QDialog一般都是Qt::WindowModal。
下面举例测试下:
main.cpp如下:
#include "QtGuiApplication1.h"
#include <QtWidgets/QApplication>
#include "QtWidgetsClass.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtGuiApplication1 w;
QtWidgetsClass k;
k.show();
w.show();
return a.exec();
}
QtGuiApplication1.cpp如下:
#include "QtGuiApplication1.h"
QtGuiApplication1::QtGuiApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
setWindowModality(Qt::ApplicationModal);
}
QtWidgetsClass.cpp如下:
#include "QtWidgetsClass.h"
QtWidgetsClass::QtWidgetsClass(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
}
现象如下:
QtGuiApplication1窗体不关闭时,在QtWidgetsClass窗体上单击鼠标、敲击键盘没有任何反应
而将上面的:
setWindowModality(Qt::ApplicationModal);
改为:
setWindowModality(Qt::WindowModal);
QtGuiApplication1窗体不关闭时,在QtWidgetsClass窗体上单击鼠标、敲击键盘有反应