Qt 模态 非模态对话框 半模态 不阻塞对话框

Part1: 什么是模态和非模态对话框

对话框分为模态对话框和非模态对话框。

所谓模态对话框

所谓模态对话框,会阻塞同一应用程序中其它窗口的输入。同时会阻塞当前线程;程序不再下执行;

关闭  窗口,执行下面的代码,这就是模态对话框

Qt使用QDialog::exec()来实现模态对话框;可以使用 close() 关闭

Qt 模态 非模态对话框 半模态 不阻塞对话框_第1张图片

例:

#include


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";

 

你可能感兴趣的:(QT,qt,QDialog,非模态对话框,半模态不阻塞对话框,模态对话框)