Qt 实战(9)窗体 | 9.2、QDialog
文章目录
- 一、QDialog
- 1、基本概念
- 2、常用特性
- 2.1、模态与非模态
- 2.2、数据交互
- 3、总结
前言:
Qt框架中的
QDialog类是一个功能强大且灵活的对话框控件,广泛应用于各种GUI(图形用户界面)应用程序中,用于处理用户输入、消息显示、设置调整等场景。通过掌握QDialog的用法,开发者可以轻松地在Qt项目中添加和管理对话框组件,提升用户交互体验。
一、QDialog
1、基本概念
对话框:在主窗口中操作,有可能触发某一个行为动作,会弹出一个新的对话窗口,解决一个临时性的会话,在对话窗口中执行某一个功能。
QDialog可以作为自定义对话框的基类,同时Qt也提供了一些标准对话框,例如:QFileDialog、QColorDialog等,下面是QDialog类的继承结构,如下:

2、常用特性
2.1、模态与非模态
对话框常用的显示模式有两种,模态与非模态
- 模态:不可以对其它窗口进行操作,调用
exec()方法显示。在对话框关闭时,exec()方法会返回一个整数值,表示对话框的关闭方式(如接受、拒绝等)。 - 非模态:可以对其它窗口进行操作,调用
show()方法显示。通常不直接返回结果,而是需要通过其他方式(如信号和槽)来获取用户输入或对话框的状态。
模态对话框又分成程序级别(
Qt::ApplicationModal)与窗口级别(Qt::WindowModal),通过QWidget::setWindowModality()方法可以设置该属性,两者的区别如下:
Qt::WindowModal:标志窗体的模态特性仅仅是作用于本窗体所在的继承层次上,也就是说本窗体的父窗体、上层的多个祖先窗体、本窗体的兄弟窗体及兄弟窗体的父窗体及其上层的多个祖先窗体的输入、响应都会被阻塞、挂起。Qt::ApplicationModal:标志窗体的模态特性作用在整个应用程序级别。只要本窗体得不到用户响应,则该应用程序所有其它窗体,用户都无法操作,即其它窗体都不响应用户的输入操作(如:键盘、鼠标操作)。
示例一:模态对话框
在Qt中,以模态方式展示对话框非常直接,例如:
MyDialog dialog;
if (dialog.exec() == QDialog::Accepted) { // 用户点击了确定按钮或等效操作 // 处理用户输入或执行其他操作
} else { // 用户点击了取消按钮或关闭了对话框 // 执行取消操作或忽略用户输入
}
示例二:非模态对话框
在Qt中,使用非模态的方式打开对话框意味着对话框在显示后不会阻塞用户对程序其他部分的交互。这通常是通过调用对话框的
show()方法来实现的,以下是一个使用非模态方式打开对话框的简单例子:
// MainWindow.cpp 或其他源文件中
#include "MyNonModalDialog.h" // 假设这是MainWindow类的一个成员函数
void MainWindow::openNonModalDialog()
{ // 创建MyNonModalDialog的实例 MyNonModalDialog *dialog = new MyNonModalDialog(this); // 将this作为父对象,以便在MainWindow被销毁时自动销毁dialog // 显示对话框 dialog->show(); // 注意:这里不需要等待对话框关闭,因为它是非模态的 // 用户可以继续与MainWindow或其他窗口交互
}
注意: 通常需要使用
new操作符动态创建,并在适当的时候手动删除。然而,在某些情况下,也可以利用Qt的父子对象系统来自动管理非模态对话框的生命周期。例如:调用QWidget::setAttribute()方法,属性设置成Qt::WA_DeleteOnClose,当窗口关闭时会自动释放内存。
QDialog对象在exec()执行完毕后的状态
重要的是要理解
exec()的返回值和对象的生命周期是两个不同的概念。
- 返回值:
exec()方法有一个返回值,通常是QDialog::Accepted或QDialog::Rejected,这取决于用户是如何关闭对话框的(比如点击了“确定”按钮还是“取消”按钮)。这个返回值是在对话框关闭并且事件循环结束后返回的。 - 对象生命周期:
QDialog对象(以及任何Qt对象)的生命周期是由其智能指针(如QSharedPointer、QPointer,但更常见的是QObject的父子关系)或原始指针(QDialog*)的管理方式决定的。仅仅因为exec()方法执行完毕并返回了,并不意味着QDialog对象就被销毁了。- 如果
QDialog对象是通过new关键字在堆上创建的,并且没有通过delete显式删除,也没有被任何智能指针管理,那么它的生命周期将一直持续到程序结束或它被显式删除。 - 如果
QDialog对象被设置为另一个QObject的子对象(通过调用setParent()),那么它的生命周期将绑定到其父对象的生命周期上。当父对象被销毁时,子对象也会被销毁(除非子对象被设置为不随父对象销毁)。
- 如果
注意: 执行完
exec(),当该函数返回后,如果QDialog对象的生命周期没有结束,就可以正常使用该对象。
2.2、数据交互
实际使用过程会经常涉及到与
QDialog之间的数据交互,下面是常用的两种方式
- 自定义信号
- 结合
std::bind()与std::function()把类成员函数作为回调
方法一:自定义信号解决数据交互
// MyDialog.h
class MyDialog : public QDialog
{Q_OBJECT
public:explicit MyDialog(QWidget *pParent);signals:void CustomSignal(QString text);
};// MainWindow.cpp 或其他源文件中
#include "MyDialog.h" // 假设这是MainWindow类的一个成员函数
void MainWindow::ShowDialog()
{// 创建MyDialog的实例 MyDialog *dialog = new MyDialog(this);connect(dialog, SIGNAL(CustomSignal(QString), this, SLOT(OnCustomSignal(QString)));dialog->exec();
}void MainWindow::OnCustomSignal(QString text)
{// 处理逻辑
}
方法二:类成员函数作为回调
// 创建 function 对象
template<typename T>
static GeneralCB CreateCB(void (T::*func)(QString), T* object)
{if (object){return std::bind(func, object, std::placeholders::_1);}return nullptr;
}class MyDialog : public QDialog
{Q_OBJECT
public:explicit MyDialog(QWidget *pParent);public:GeneralCB m_cb;
};// MainWindow.cpp 或其他源文件中
#include "MyDialog.h" // 假设这是MainWindow类的一个成员函数
void MainWindow::openNonModalDialog()
{// 创建MyNonModalDialog的实例 MyDialog *dialog = new MyDialog(this);dialog->m_cb = CreateCB(MainWindow::OnCustomFunc, this);dialog->exec();
}void MainWindow::OnCustomFunc(QString text)
{// 处理逻辑
}
3、总结
QDialog是Qt中创建对话框的强大工具,通过它,可以轻松地实现各种复杂的用户交互场景。无论是简单的消息提示还是复杂的配置窗口,QDialog都能满足需求。
相关文章:
Qt 实战(9)窗体 | 9.2、QDialog
文章目录 一、QDialog1、基本概念2、常用特性2.1、模态与非模态2.2、数据交互 3、总结 前言: Qt框架中的QDialog类是一个功能强大且灵活的对话框控件,广泛应用于各种GUI(图形用户界面)应用程序中,用于处理用户输入、消…...
Spring 事务机制
1. 引言 1.1 什么是事务 事务是由用户定义的一系列操作序列所组成的最小工作单元;这些操作要么全部完成,要么全部不完成,是一个不可分割的工作单元。常见于数据库中的并发控制和数据一致性处理场景。 1.2 事务的特性 事务具有以下特性&am…...
Android 13 GMS 内置壁纸
如图,原生系统上,设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面 扩展下,默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…...
【LeetCode】234. 回文链表
回文链表 题目描述: 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2&#…...
零基础学会机器学习,到底要多久?
这两天啊,有不少朋友和我说,想学机器学习,但是之前没有基础,不知道能不能学得会。 首先说结论,只要坚持,就能学会,但是一定不能三天打鱼两天晒网,要持之以恒,至少每隔两…...
视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?
安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台,支持多种视频格式和编码方式(H.264/H.265),能够轻松对接各类前端监控设备,实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…...
Qt解析XML
背景 本来想解析VS的项目配置文件(*.vcxproj),配合cppclean来发现多余的#incldue。 结果发现低估了难度,VS会间接引入许多目录。 略有不甘,暂且作为一个解析XML文件的示例。 代码 VSProjectParser.h #include <QVector> #include…...
PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解
Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码,我们试试暴力破解 image-20240807122743025 开始爆破了,全部失败,哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…...
OpenCV—二值化Threshold()、adaptiveThreshold()
cv2.threshold() c:double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注:源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src:源图片…...
第二天:java面向对象编程(OOP)
第二天:java面向对象编程(OOP) 1. 深入理解OOP四大特性 封装(Encapsulation):学习如何将数据(属性)和操作数据的方法(行为)组合成一个独立的单元࿰…...
Selenium + Python 自动化测试07(滑块的操作方法)
我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。 本篇文章主要讲述如何操作滑块。 目前很多系统登录或者注册的页面都有滑块相关的验证,selenium 中对滑块的基本操作采用了元素的拖曳的方式。需要用到Actiochains模…...
三防平板满足多样化定制为工业领域打造硬件解决方案
在当今工业领域,数字化、智能化的发展趋势日益显著,对于高效、可靠且适应各种复杂环境的硬件设备需求不断增长。三防平板作为一种具有坚固耐用、防水防尘防摔特性的工业级设备,正以其出色的性能和多样化的定制能力,为不同行业的应…...
pytorch,用lenet5识别cifar10数据集(训练+测试+单张图片识别)
目录 LeNet-5 LeNet-5 结构 CIFAR-10 pytorch实现 lenet模型 训练模型 1.导入数据 2.训练模型 3.测试模型 测试单张图片 代码 运行结果 LeNet-5 LeNet-5 是由 Yann LeCun 等人在 1998 年提出的一种经典卷积神经网络(CNN)模型,主要…...
Word卡顿的处理方法
1. 检查和关闭后台程序 关闭不必要的后台程序,释放系统资源。使用任务管理器(Ctrl + Shift + Esc)查看占用CPU和内存较高的应用,并关闭它们。2. 更新Microsoft Office 确保你的Microsoft Office软件是最新版本。新版本通常修复了已知的性能问题。打开Word,点击文件 > 账…...
在 Linux上常见的10大压缩格式解压命令和它们对应的压缩格式
文章目录 前言一、解压 .zip 文件二、解压 .tar.gz 或 .tgz 文件三、解压 .tar 文件四、解压 .tar.bz2 文件五、解压 .tar.xz 文件六、解压 .gz 文件七、解压 .bz2 文件八、解压 .xz 文件九、解压 .7z 文件十、解压 .rar 文件总结 前言 Linux 命令可以解压不同格式的压缩文件。…...
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
文章目录 2.链队列2.1初始化(带头结点)不带头结点 2.2入队(带头结点)2.3出队(带头结点)❗2.4链队列c实例 3.双端队列考点:输出序列合法性栈双端队列 队列的应用1.树的层次遍历2.图的广度优先遍历3.操作系统…...
技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定
作者:Rachel Kang 排版:Alan Wang 在当今的应用开发领域,通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件,甚至允许无缝创建跨平台自定义控件。然而&a…...
Linux笔记 --- 标准IO
系统IO的最大特点一个是更具通用性,不管是普通文件、管道文件、设备节点文件、接字文件等等都可以使用,另一个是他的简约性,对文件内数据的读写在任何情况下都是带任何格式的,而且数据的读写也都没有经过任何缓冲处理,…...
洛谷:B3625 迷宫寻路
迷宫寻路 题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n m n\times m nm 矩阵,每个位置要么是空地,要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置,问能否…...
【C#】explicit、implicit与operator
字面解释 explicit:清楚明白的;易于理解的;(说话)清晰的,明确的;直言的;坦率的;直截了当的;不隐晦的;不含糊的。 implicit:含蓄的;不直接言明的;成为一部分的;内含的;完全的;无疑问的。 operator:操作人员;技工;电话员;接线员;…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
