Qt中的模态、非模态、半模态窗口
简述
模态对话框
简单一点讲就是在弹出模态对话框时,除了该对话框,整个应用程序的窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭。这时一般需要用户点击对话框中的确定或取消按钮来关闭该对话框,程序得到对话框的返回值,并根据返回值进行相应的操作,之后将操作权返回给用户。这个时候用户就可以点击或者拖动程序其他窗口了。
非模态对话框
非模态对话框又叫做无模式对话框,即弹出非模态对话框时,用户仍然可以对其他窗口进行操作,不会因为这个对话框未关闭就不能操作其他窗口。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
半模态对话框
半模态对话框区别于模态与非模态对话框,或者说是介于两者之间,也就是说半模态对话框会阻塞窗口的响应,但是不会影响后续代码的执行。
在Qt中我们常用的窗口有 QWidget、QMainWindow 以及 QDialog。
下面我们结合Qt帮助文档来看一下这三种窗口之间的关系,以及如何实现模态、非模态和半模态。
继承关系
QWidget
QWidget类是所有用户界面对象的基类。
窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且将自己的表现形式绘制在屏幕上。每一个窗口部件都是矩形,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
show()
QWidget的显示是通过 show() 方法来实现的,查看帮助文档可以看到
介绍的比较简单,只是说明了显示窗口以及他的子窗口。这里需要注意的是,通过 show() 方法显示的 QWidget 是非模态对话框。
setWindowModality()
QWidget提供了 setWindowModality() 方法来设置窗口为模态或非模态
setWindowModality() 方法可以设置窗口是否是模态窗口,从上图中我们可以看到Qt::WindowModality的默认值为Qt::NonModal,也就是非模态窗口。所以如果没有设置Qt::WindowModality属性值,我们每次用 show() 方法显示出的窗口都是非模态窗口。
QMainWindow
QMainWindow类提供一个有菜单条、工具栏、状态条的主应用程序窗口。
一个主窗口提供了构建应用程序的用户界面框架。Qt拥有QMainWindow及其相关类来管理主窗口。QMainWindow拥有自己的布局,我们可以使用QMenuBar(菜单栏)、QToolBar(工具栏)、QStatusBar(状态栏)以及QDockWidget(悬浮窗体),布局有一个可由任何种类小窗口所占据的中心区域。
QMainWindow的模态、非模态和 QWidget一样可以通过 setWindowModality() 来设置。
QDialog
QDialog类是对话框窗口的基类。
对话框窗口是一个顶级窗体,主要用于短期任务以及和用户进行简要通讯。QDialog可以是模态的也可以是非模态的。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。
查看帮助文档我们发现在QDialog中除了继承QWidget的 show() 方法外,还多了两个方法来显示窗口,分别是 open() 和 exec() 方法。
open()
- 可以看到使用 open() 方法显示出的对话框为窗口级模态对话框,并且立即返回,这样 open() 方法后的代码将会继续执行
示例:
void showWindow()
{
QWidget* pWindow = new QWidget();
QWidget* childWindow = new QWidget(pWindow);
childWindow->setWindowModality(Qt::WindowModal); // 窗口级模态对话框
childWindow->show();
// 上面三行代码相当于下面两行代码
//QDialog* childDialog = new QDialog(pWindow);
//childDialog->open();
// 这里不会阻塞,这行代码会运行
qDebug() << "这是一个半模态窗口";
}
exec()
- 可以看到使用 exec() 方法显示出的对话框为应用程序级模态对话框,同时会阻塞之前窗口的响应直到用户关闭这个对话框,并且返回DialogCode(包括Accepted和Rejected两个值)结果。
示例1:
void showModalWindow()
{
QWidget* pWindow = new QWidget();
QWidget* childWindow = new QWidget(pWindow);
childWindow->setWindowModality(Qt::ApplicationModal); // 应用程序级模态对话框
childWindow->show();
// 注意这里上面的三行代码不等于下面两行代码
// 上面调用完 show() 方法后立即返回了,并不知道用户选择了Accepted还是Rejected
// 而 exec() 会阻塞后面代码的执行,直到对话框关闭,返回结果
//QDialog* childDialog = new QDialog(pWindow);
//childDialog->exec();
}
示例2:
void showModalWindow()
{
QWidget* pWindow = new QWidget();
QDialog* childDialog = new QDialog(pWindow);
int resutl = childDialog ->exec();
if (resutl == QDialog::Accepted)
{
qDebug() << "You Choose Ok";
}
else
{
qDebug() << "You Choose Cancel";
}
// 在关闭对话框之后,下面的代码才可以执行;
qDebug() << "这才是一个模态窗口";
}
QWidget、QMainWindow和QDialog的使用原则
- 如果需要嵌入到其他窗体中,则基于QWidget创建。
- 如果是顶级对话框,则基于QDialog创建。
- 如果是主窗体,则基于QMainWindow创建。
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓
相关文章
- qt 当前窗口句柄_QT获取窗口句柄
- Qt核心:元对象系统(1)- 元对象和元数据
- qt怎么设置窗口标题_qt自定义标题栏
- PyQt5可视化 7 饼图和柱状图实操案例 ①Qt项目的创建
- C/C++ Qt StandardItemModel 数据模型应用
- C/C++ Qt StatusBar 底部状态栏应用
- C/C++ Qt TreeWidget 单层树形组件应用
- Qt Quick实践系列-多语言切换
- Qt的信号是私有还是公有
- Qt自绘系列-频谱图
- 【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 编辑 Qt 桌面按钮控件 | 修改按钮文本 | 为按钮添加点击事件 | 系统调用 | 去掉系统调用命令窗口 )
- 解决Ubuntu下使用linuxdeployqt打包Qt程序问题
- Vmware虚拟机中CentOS安装 CentOS安装Qt的教程图解
- linux下qt桌面环境开发实践(linuxqt桌面)
- 在Linux上体验Qt的魅力(linux下运行qt)
- Qt下Linux系统的输入法研究(qt输入法linux)
- Qt蓝牙编程指南:在Linux系统上使用Qt开发蓝牙应用程序(qt蓝牙编程linux)
- 开发linux下 Qt 图形界面开发实践(linux下qt图形界面)
- 构建Linux下Qt开发环境,实现跨平台C开发(linuxqt开发环境)
- Linux上Qt的快速安装(linux下载qt)
- Linux下Qt编程实战指南(linuxqt编程)
- 如何在QT应用程序中使用MYSQL进行编程?(qt的mysql编程)
- 入门Linux下Qt编程,掌握技巧!(linux下qt编程入门)
- Linux环境下如何卸载Qt应用(linux卸载qt)
- Linux Qt窗口:快速构建你的GUI界面(linux qt 窗口)
- 使用Linux系统成功运行QT程序的步骤与技巧(linux运行qt程序)
- 使用嵌入式Linux和QT创建新世界(嵌入式linuxqt)
- 从 Qt 中编译到 MySQL 的进程(qt mysql 编译)
- Redis使用Qt解决读写互斥问题(redis读写互斥qt)