QDialog之模态与非模态

本文详细介绍了QtDialog的模态和非模态设置,包括setModal()、setWindowModality()和setAttribute()函数的影响。QDialog的exec()函数会始终以模态方式显示对话框并阻塞,而show()函数则不阻塞,模态状态下使用show()需要注意对象生命周期。此外,WindowModality属性决定阻塞范围,ApplicationModal会阻塞整个应用,WindowModal仅阻塞父窗口及其关联窗口。

QtDialog在创建时默认为非模态(modal属性为false),可以通过setModal()函数设置对话框为模态还是非模态。

窗口是否是模态和非模态和窗口(包括QDialog和QWidget等)的exec()和show()等函数无直接关系,只和窗口的阻塞方式有关。
setWindowModality()函数是用来设置QWidget运行时的窗口阻塞方式,可以实现窗口是模态还是非模态。

参数类型含义
Qt::NonModal窗口不是模态,并且不阻塞其它任何窗口
Qt::WindowModal窗口是模态对于单个的窗口层次,并且阻塞其所有祖先窗口(包括其父窗口、父窗口的兄弟窗口以及父窗口和父窗口的兄弟窗口的祖先窗口)
Qt::ApplicationModal窗口是模态对于这个应用程序,并且阻塞应用程序内的其它所有窗口

窗口初始化时,与窗口模态和非模态状态有关的三个变量的默认值:

变量默认值
isModalfalse
WA_ShowModalfalse
WindowModalityNonModal

isModal()函数返回的值是窗口的window_modality值。
 
将窗口设置为模态:

setModal(true); // 对话框特有
setAttribute(Qt::WA_ShowModal, true); // 设置WA_ShowModal属性
setWindowModality(Qt::ApplicationModal); // 设置阻塞方式

将窗口设置为非模态:

setModal(false); // 对话框特有
setAttribute(Qt::WA_ShowModal, false); // 设置WA_ShowModal属性
setWindowModality(Qt::NonMoal); // 设置阻塞方式

对话框的setModal(bool)、setWindowModality(Qt::WindowModality)和setAttribute(Qt::WA_ShowModal, bool)是相互影响的,调用其中任一函数,其它的值都会改变。

setModal()false
isModalfalse
WA_ShowModalfalse
WindowModalityNonModal
setModal()true
isModaltrue
WA_ShowModaltrue
WindowModalityApplicationModal
setAttribute(Qt::WA_ShowModal, bool)false
isModalfalse
WA_ShowModalfalse
WindowModalityNonModal
setAttribute(Qt::WA_ShowModal, bool)true
isModaltrue
WA_ShowModaltrue
WindowModalityApplicationModal
setWindowModality()NonModal
isModalfalse
WA_ShowModalfalse
WindowModalityNonModal
setWindowModality()WindowModal
isModaltrue
WA_ShowModaltrue
WindowModalityWindowModal
setWindowModality()ApplicationModal
isModaltrue
WA_ShowModaltrue
WindowModalityApplicationModal

注:
当调用setWindowModality(Qt::WindowModality)设置WindowModality为ApplicationModal或WindowModal后,再次调用setModal(true)或setAttribute(Qt::WA_Show_Modal,true)时,不会影响isModal()、WA_ShowModal和WindowModality的值,即isModal()和WA_ShowModal的值仍为true,而WindowModality的值仍为ApplicationModal或WindowModal。

QDialog的exec()函数

  1. 该函数忽略对话框的modal属性,总是将对话框作为模态显示;
  2. 该函数本身不会改变窗口的WindowModality、WA_ShowModal和modal值;
  3. 当以该函数显示对话框时,总是将对话框作为模态显示,并且阻塞直到用户主动关闭此对话框,并返回DialogCode result;
  4. 当以该函数显示对话框时,如果该对话框的WindowModality属性为ApplicationModal,在用户关闭此对话框之前,在此相同的应用程序的其它所有窗口都会被阻塞;如果WindowModality属性为WindowModal,在用户关闭此对话框之前,与该窗口的父窗口有关联的所有窗口(包括父窗口本身),即该窗口的所有祖先窗口,都会被阻塞;如果WindowModality属性为NonModal,默认情况与WindowModality属性为ApplicationModal一样。

QDialog的show()函数

  1. 该函数本身不会阻塞,调用后立即返回;
  2. 当窗口是模态状态,并且通过show()显示,此时窗口对象不能为局部变量(指针类型除外),否则show()调用后立即返回,该对象的作用域超过后,对象就会被销毁,窗口就是一闪而过的效果;
  3. 当窗口以模态状态显示,并且WindowModality值为WindowModal时,该窗口的父窗口不能为NULL,否则窗口虽然是模态,但因为父窗口是NULL且阻塞方式为WindowModality,窗口依然不会阻塞任何窗口,效果就如同非模态一样;
  4. 当窗口以非模态状态显示时,
    4.1. 该窗口必须是通过show()显示,不能通过exec()显示。因为此时WindowModality值为NoModal,如果通过exec()调用显示,则其效果与WindowModality值为ApplicationModal的值一样,该窗口会阻塞该应用程序的其它所有窗口;
    4.2. 该窗口对象不能为局部变量(指针类型除外),否则show()调用后立即返回,该对象的作用域超过后,对象就会被销毁,窗口就是一闪而过的效果,不能达到非模态对话框实际的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值