Qt::WindowModal和Qt::ApplicationModal的区别

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窗体上单击鼠标、敲击键盘有反应

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值