窗口显示分为两种模式, 模态和非模态, 模态窗口一般会阻塞本进程其它窗口, 但非模态窗口不会

(1) 模态对话框

会阻塞同一应用程序中其它可视窗口输入的对话框。模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框仅阻止访问与对话相关联的窗口,允许用户继续使用其它窗口中的应用程序。
显示模态对话框最常见的方法是调用其exec()函数,当用户关闭对话框,exec()将提供一个有用的返回值,并且这时流程控制继续从调用exec()的地方进行。
通常情况下,要获得对话框关闭并返回相应的值,我们连接默认按钮,例如:”确定”按钮连接accept()槽,”取消”按钮连接reject()槽。另外我们也可以连接done()槽,传递给它Accepted或Rejected。

(2) 非模态对话框

和同一个程序中其它窗口操作无关的对话框。在Word中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框,并立即将控制返回给调用者。

(3) 半模态对话框

半模态, 即对原本非模态的对话框设置为模态属性
调用setModal(true)或者setWindowModality(QtCore.Qt.ApplicationModal),然后show()。有别于exec(),show()立即返回给控制调用者。对于进度对话框来说,调用setModal(true)是非常有用的,用户必须拥有与其交互的能力,例如:取消长时间运行的操作。
如果使用show()和setModal(true)共同执行一个长时间操作,则必须定期在执行过程中调用QApplication::processEvents(),以使用户能够与对话框交互(可以参考QProgressDialog)。
注: setWindowModalit参数

常量 含义
Qt.NoModal 0 窗口模式设定为非模态 (默认值)
Qt.WindowModal 1 窗口模式设定为单窗口, 会阻止其所有的父窗口及兄弟窗口获得输入
Qt.ApplicationModal 2 窗口模式设定为模态, 阻止该应用下其它所有窗口获得输入