Part1: 什么是模态和非模态对话框
对话框分为模态对话框和非模态对话框。
所谓模态对话框
所谓模态对话框,会阻塞同一应用程序中其它窗口的输入。同时会阻塞当前线程;程序不再下执行;
关闭 窗口,执行下面的代码,这就是模态对话框
Qt使用QDialog::exec()来实现模态对话框;可以使用 close() 关闭
例:
#include<QDialog>
QDialog* dlg = new QDialog(this);
dlg.exec();
非模态对话框
非模态对话框就是在打开它的时候,仍旧能够操作其它的窗口。
Qt使用QDialog::show() 显示非模态对话框 可以使用 close() 关闭
例:
QDialog* dlg = new QDialog(this);
dlg->show();
半模态 不阻塞对话框
会阻塞同一应用程序中其它窗口的输入。show() 之后程序向下执行;不阻塞当前线程
Qt使用QDialog::show()来实现模态对话框;可以使用 close() 关闭
sub 1:
setModal(true);
QDialog* dlg= new QDialog();
dlg->setModal(true);
dlg->show();
sub 2:
Qt 中的 QWidget 对象自带 setWindowModality(type) ,所以 QWidget 也可以实现半模态
QDialog dlg(this);
dlg.setWindowModality(Qt::ApplicationModal);
dlg.show();
- 说明:setWindowModality()的参数设置要阻塞的窗口类型:
枚举值 | 值 | 说明 |
---|---|---|
Qt::NonModal | 0 | 非模态,不阻塞任何窗口 |
Qt::WindowModal | 1 | 模态,阻塞它的父窗口、所有的祖先窗口以及他们的子窗口 |
Qt::ApplicationModal | 2 | 模态,阻塞应用程序所有的窗口 |
sub 3: 同时 可以用 QWidget setAttribute 来实现;
注意:我尝试了 这个在 QDialog 无效;
pWidget->setAttribute(Qt::WA_ShowModal, true); //属性设置 true:模态 false:非模态
QWidget *pWidget = new QWidget();
pWidget->setAttribute(Qt::WA_ShowModal, true);
pWidget->show();
qDebug()<<"ddd";
other:
setWindowFlags( Qt::WindowStaysOnTopHint |Qt::Dialog);
理论上 QWidget 是不能实现模态的;只能实现半模态;
QWidget *pWidget = new QWidget(this);
//pWidget->setAttribute(Qt::WA_ShowModal, true);
pWidget->setWindowFlags( Qt::WindowStaysOnTopHint |Qt::Dialog);
pWidget->show();
qDebug()<<"ddd";