素材巴巴 > 程序开发 >

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

程序开发 2023-09-14 22:40:21

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

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

所谓模态对话框

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

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

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

 

例:

#includeQDialog* 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();
 
枚举值值说明Qt::NonModal0非模态,不阻塞任何窗口Qt::WindowModal1模态,阻塞它的父窗口、所有的祖先窗口以及他们的子窗口Qt::ApplicationModal2模态,阻塞应用程序所有的窗口

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


标签:

上一篇: Angular安装及创建第一个项目 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。