QtDialog在创建时默认为非模态(modal属性为false),可以通过setModal()函数设置对话框为模态还是非模态。
窗口是否是模态和非模态和窗口(包括QDialog和QWidget等)的exec()和show()等函数无直接关系,只和窗口的阻塞方式有关。
setWindowModality()函数是用来设置QWidget运行时的窗口阻塞方式,可以实现窗口是模态还是非模态。
| 参数类型 | 含义 |
|---|---|
| Qt::NonModal | 窗口不是模态,并且不阻塞其它任何窗口 |
| Qt::WindowModal | 窗口是模态对于单个的窗口层次,并且阻塞其所有祖先窗口(包括其父窗口、父窗口的兄弟窗口以及父窗口和父窗口的兄弟窗口的祖先窗口) |
| Qt::ApplicationModal | 窗口是模态对于这个应用程序,并且阻塞应用程序内的其它所有窗口 |
窗口初始化时,与窗口模态和非模态状态有关的三个变量的默认值:
变量 默认值 isModal false WA_ShowModal false WindowModality NonModal 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 isModal false WA_ShowModal false WindowModality NonModal
setModal() true isModal true WA_ShowModal true WindowModality ApplicationModal
setAttribute(Qt::WA_ShowModal, bool) false isModal false WA_ShowModal false WindowModality NonModal
setAttribute(Qt::WA_ShowModal, bool) true isModal true WA_ShowModal true WindowModality ApplicationModal
setWindowModality() NonModal isModal false WA_ShowModal false WindowModality NonModal
setWindowModality() WindowModal isModal true WA_ShowModal true WindowModality WindowModal
setWindowModality() ApplicationModal isModal true WA_ShowModal true WindowModality ApplicationModal 注:
当调用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()函数
- 该函数忽略对话框的modal属性,总是将对话框作为模态显示;
- 该函数本身不会改变窗口的WindowModality、WA_ShowModal和modal值;
- 当以该函数显示对话框时,总是将对话框作为模态显示,并且阻塞直到用户主动关闭此对话框,并返回DialogCode result;
- 当以该函数显示对话框时,如果该对话框的WindowModality属性为ApplicationModal,在用户关闭此对话框之前,在此相同的应用程序的其它所有窗口都会被阻塞;如果WindowModality属性为WindowModal,在用户关闭此对话框之前,与该窗口的父窗口有关联的所有窗口(包括父窗口本身),即该窗口的所有祖先窗口,都会被阻塞;如果WindowModality属性为NonModal,默认情况与WindowModality属性为ApplicationModal一样。
QDialog的show()函数
- 该函数本身不会阻塞,调用后立即返回;
- 当窗口是模态状态,并且通过show()显示,此时窗口对象不能为局部变量(指针类型除外),否则show()调用后立即返回,该对象的作用域超过后,对象就会被销毁,窗口就是一闪而过的效果;
- 当窗口以模态状态显示,并且WindowModality值为WindowModal时,该窗口的父窗口不能为NULL,否则窗口虽然是模态,但因为父窗口是NULL且阻塞方式为WindowModality,窗口依然不会阻塞任何窗口,效果就如同非模态一样;
- 当窗口以非模态状态显示时,
4.1. 该窗口必须是通过show()显示,不能通过exec()显示。因为此时WindowModality值为NoModal,如果通过exec()调用显示,则其效果与WindowModality值为ApplicationModal的值一样,该窗口会阻塞该应用程序的其它所有窗口;
4.2. 该窗口对象不能为局部变量(指针类型除外),否则show()调用后立即返回,该对象的作用域超过后,对象就会被销毁,窗口就是一闪而过的效果,不能达到非模态对话框实际的效果。
本文详细介绍了QtDialog的模态和非模态设置,包括setModal()、setWindowModality()和setAttribute()函数的影响。QDialog的exec()函数会始终以模态方式显示对话框并阻塞,而show()函数则不阻塞,模态状态下使用show()需要注意对象生命周期。此外,WindowModality属性决定阻塞范围,ApplicationModal会阻塞整个应用,WindowModal仅阻塞父窗口及其关联窗口。

3万+

被折叠的 条评论
为什么被折叠?



