8.QT-对话框(模态与非模态)
对话框介绍
- 对话框是于用户进行简易交互的顶层窗口
- QDialog是Qt中所有对话框窗口的父类,是一种容器类型的组件
- QDialog继承于QWidget类,如下图所示:

QWidget和QDialog有什么不同
QDialog:
- QDialog是定制了窗口式样的特殊的QWidget
- QDialog只能作为专用的交互窗口
- QDialog不能作为子部件,嵌入其它容器中
QWidget:
- QWidget如果没有父组件,则将会成为一个主窗口,
- QWidget如果有父组件,则将成为其父组件的子部件,嵌入到其父组件里
代码试验: QWidget和QDialog区别
代码1:
int main(int argc, char *argv[])
{
QApplication a(argc, argv); QWidget w;
w.resize(,); QDialog d(&w);
d.resize(,); w.show();
d.show(); return a.exec();
}
效果:

可以看到,对话框始终都是作为独立的交互窗口
代码2:
int main(int argc, char *argv[])
{
QApplication a(argc, argv); QWidget w1;
w1.resize(,); QWidget w2(&w1);
w2.resize(,); w1.show();
w2.show(); return a.exec();
}
效果:

可以看到只出现了一个窗口,并没有出现第二个窗口
对话框类型
模态对话框
- 属于阻塞式调用,指没有关闭该对话框之前,是无法与其它任何窗口进行交互的
- 用于依赖用户选择的场合,比如:选项设置,消息提示,字体设置等
- 在栈上创建模态对话框是最简单常用的方式
- 使用exec()进入对话框的消息循环,从而实现阻塞式调用
实验代码:
int main(int argc, char *argv[])
{ QApplication a(argc, argv); QWidget w;
w.resize(,);
w.show(); QDialog d(&w);
d.resize(,);
d.exec(); //进入对话框d的消息循环,从而实现阻塞式调用 return a.exec();
}
非模态对话框
- 属于非阻塞调用,指出现该对话框时,也可以与父窗口进行交互
- 用于特殊功能设置的场合,比如:查找操作
- 一般情况下非模态对话框需要在堆上创建,避免自动被摧毁
- 非模态对话框需要通过setAttribute()成员函数指定Qt::WA_DeleteOnClose属性
- Qt::WA_DeleteOnClose表示:退出窗口后,让Qt自动摧毁这个对话框
- 使用show()来显示对话框窗口,从而实现非阻塞调用
实验代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv); QWidget w;
w.resize(,);
w.show(); QDialog *d = new QDialog(&w); d->setAttribute(Qt::WA_DeleteOnClose);
d->resize(,);
d->show(); return a.exec();
}
混合模态对话框
- 在非模态对话框的基础上调用QDialog::setModal(true)成员函数实现
实验代码:
int main(int argc, char *argv[])
{ QApplication a(argc, argv); QWidget w;
w.resize(,);
w.show(); QDialog *d = new QDialog(&w);
d->setAttribute(Qt::WA_DeleteOnClose);
d->setModal(true);
d->resize(,);
d->show(); return a.exec();
}
对话框返回值处理
- 只有模态对话框才有返回值概念
- QDialog::exec()的返回值作为交互结果
-使用void QDialog::done ( int r ) 作为交互结果,将r值返回给exec()
-返回值为QDialog::Accepted时,表示用户操作成功
-返回值为QDialog::Rejected时,表示用户操作失败
-也可以自定义返回数值
非模态示例-制作查找对话框
由于查找对话框每次打开时,都会有上次状态的内容,所以需要用到QSharedPointer动态指针
QFindDialog对话框:
class QFindDialog : public QDialog
{
private:
QLabel label;
QLineEdit edit;
QPushButton ButtonFind;
QPushButton ButtonCancel;
QCheckBox CkBoxCase;
QGroupBox GrpBoxDir;
QRadioButton PreButton;
QRadioButton NextButton;
QGridLayout GLayout;
QHBoxLayout HBLayout;
public:
QFindDialog(QWidget* parent=);
}; QFindDialog::QFindDialog(QWidget *parent) :
QDialog(parent,Qt::WindowCloseButtonHint|Qt::Drawer),
label("查找内容:",this),
edit(this),
ButtonFind("查找下一个",this),
ButtonCancel("取消",this),
CkBoxCase("区分大小写",this),
GrpBoxDir("方向",this),
PreButton("向上",this),
NextButton("向下",this),
GLayout(this),
HBLayout(this)
{
PreButton.setChecked(true);
HBLayout.addWidget(&PreButton);
HBLayout.addWidget(&NextButton);
GrpBoxDir.setLayout(&HBLayout); //将单选按钮添加到QGroupBox分组框
GLayout.setSpacing();
GLayout.addWidget(&label,,);
GLayout.addWidget(&edit,,);
GLayout.addWidget(&ButtonFind,,);
GLayout.addWidget(&CkBoxCase,,);
GLayout.addWidget(&GrpBoxDir,,);
GLayout.addWidget(&ButtonCancel,,);
this->setLayout(&GLayout);
setWindowTitle("查找");
}
widget窗口文件:
class Widget : public QWidget
{
Q_OBJECT
private :
QPushButton btn;
QSharedPointer<QFindDialog> FindDialog; //动态指针
private slots:
void onclickedbtn();
public:
explicit Widget();
}; Widget::Widget():
btn("查找",this),
FindDialog(new QFindDialog(this))
{
connect(&btn,SIGNAL(clicked()),this,SLOT(onclickedbtn())); }
void Widget::onclickedbtn()
{
FindDialog->show(); //显示查找对话框
}
效果:

8.QT-对话框(模态与非模态)的更多相关文章
- Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)
概念 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 1. 模态窗体 ...
- Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中 ...
- Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good
在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...
- MFC模态和非模态对话框编程
MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程 ...
- C++ 模态与非模态对话框
视频教程:模态与非模态对话框1 模态对话框:子窗口关闭之前,不能对父窗口操作 非模态对话框:子窗口关闭之前,可以对父窗口操作 插入一个对话框: 资源视图--->右击---> 进行类的绑定: ...
- MFC 点击按钮,弹出另一个对话框(模态及非模态对话框)
1. 模态对话框 资源视图->Dialog->右键->添加资源->新建->对话框->右键->添加类. 例如:在A_dialog中点击按钮弹出B_dialog ...
- QT对话框模式与非模式
QT模态对话框及非模态对话框 非模态对话框(Modeless Dialog)的概念不是模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭.对于在模态来显示对 ...
- Qt对话框之二:模态、非模态、半模态对话框
一.模态对话框 模态对话框:阻塞同一应用程序中其它可视窗口输入的对话框.模态对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口. 显示模态对话 ...
- QT 中的模态和非模态对话框
void MainWindow::on_pushButton_clicked() { //模态 QDialog dlg(this); dlg.resize(100,100); dlg.exec(); ...
- Qt模态与非模态
模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...
随机推荐
- lamp环境搭建经验总结
环境:centos6.4,13个源码包:参考教程高罗峰细说php思路:1.首先确定gcc,g++的安装,因为这是c语言的编译工具,没有它,源码不可能安装,redhat的yum需要配置,分为本地源和网络 ...
- centos7.4下离线安装CDH5.7
(一)安装前的规划 (1)操作系统版本:centos7.4(64bit) [root@hadoop22 etc]# more /etc/centos-release CentOS Linux rele ...
- 20165226 2017-2018-4 《Java程序设计》第6周学习总结
20165226 2017-2018-4 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用实用类 string类 并置 两个常量进行并置,得到的仍是常量. public ...
- Docker学习笔记 - Docker的远程访问
学习内容: 配置客户端与守护进程的远程访问 服务端配置-H选项: 使服务端支持远程被访问 客户端使用-H选项: 使客户端访问远程服务端 本地环境DOCKER_HOST设置客户端访问的默认服务端地址 准 ...
- Spring Security 入门(1-7)Spring Security - Session管理
参考链接:https://xueliang.org/article/detail/20170302232815082 session 管理 Spring Security 通过 http 元素下的子元 ...
- [Luogu1342] 请柬 - 最短路模板
Description 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣传剧院,尤其是古色古香的喜剧片.他们已经打印请帖和所有必要的信息和计划.许多学生被 ...
- SpringMVC(十二):SpringMVC 处理输出模型数据之@ModelAttribute
Spring MVC提供了以下几种途径输出模型数据:1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据:2)Map及Model:处理方法入参 ...
- 【原创】公司各个阶段 CTO 需要做什么?(下篇)
假设一个公司发展有以下几个阶段: 0 :创始阶段: 0.5 :有产品但无管理阶段: 1 :经过 1年的发展初步稳定的阶段: 1+ :稳步发展阶段. 上一篇文章中,我们聊了公司在初创阶段,CTO 需要做 ...
- MySQL操作与修改表
插入数据(insert) insert语句的3个主要组成部分: 所要插入数据的表的名称: 表终需要使用的列的名称: 需要插入到列的值. 数字型主键生成机制 数字型主键生成机制,除了随机选择数字外,还可 ...
- Python3NumPy——数组(2)之数学空间与NumPy空间
0 介绍 本文承接上一篇,文章采用新的阐述方式,将数学中的表达与NumPy中的函数关联起来. 采用这种方式,可以直接建立数学表达与计算系统的对应关系,更易理解. 由于博客编写时间有限,每次尝试一个知识 ...