一、模态对话框和非模态对话框的概念
1、模态对话框,就是当其弹出后,会置于窗口最上层,软件的其他窗口无法接受用户点击和输入,只有其在被关闭后,其他窗口才能继续和用户交互。模态对话框的应用场景广泛,比如弹出式参数设置对话框,需要确保用户手动确定或者关闭。比如windows里的环境变量窗口:
这时候如果不点击确定或者取消以及右上角的关闭,我们就无法点击系统属性窗口。
2、非模态对话框,它弹出后,软件的其他窗口仍能与用户交互,比如以下:
点击了高级系统设置,弹出系统属性窗口,仍然能对系统窗口做操作,
所以系统属性窗口相对于系统窗口而言,就是非模态对话框。
二、在Qt中,通常是使用QDialog或者QWidget作为弹出式窗口
以下分别对二者如何设置模态做一个比较和结论。
如果是QDialog:
1、通过以下语句设置,即为模态,父对象地址传入与否,不影响模态的效果。
QDialog dialog(this);
dialog.exec();
2、或者通过show()函数,前提是需要通过setModal()设置为模态。
QDialog *dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();
如果是QWidget:
QWidget需要调用setWindowMondality()函数来设置模态属性,否则默认为非模态。
QWidget *w = new QWidget(this);
w->setWindowModality(Qt::ApplicationModal);
setWindowMondality()函数接受枚举值以设置不同的效果,分别是:
Qt::ApplicationModal 表示该窗口阻塞程序的所有窗口。
Qt::WindowModal 表示阻塞它的父窗口,所有祖先窗口以及它们的子窗口。
Qt::NonModal 表示不阻塞任何窗口,就是非模态。
三、Qt窗口置顶显示的两种方式
_dock->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Dialog);
SetWindowPos(reinterpret_cast<HWND>(_dock->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
窗口置顶表示该窗口位于一切窗口之上,其他的窗口拖过来,也会被其遮挡。