当前位置: 首页 > news >正文

Qt 实战(9)窗体 | 9.2、QDialog

文章目录

  • 一、QDialog
    • 1、基本概念
    • 2、常用特性
      • 2.1、模态与非模态
      • 2.2、数据交互
    • 3、总结

前言:

Qt框架中的QDialog类是一个功能强大且灵活的对话框控件,广泛应用于各种GUI(图形用户界面)应用程序中,用于处理用户输入、消息显示、设置调整等场景。通过掌握QDialog的用法,开发者可以轻松地在Qt项目中添加和管理对话框组件,提升用户交互体验。

一、QDialog

1、基本概念

对话框:在主窗口中操作,有可能触发某一个行为动作,会弹出一个新的对话窗口,解决一个临时性的会话,在对话窗口中执行某一个功能。QDialog可以作为自定义对话框的基类,同时Qt也提供了一些标准对话框,例如:QFileDialogQColorDialog等,下面是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::AcceptedQDialog::Rejected,这取决于用户是如何关闭对话框的(比如点击了“确定”按钮还是“取消”按钮)。这个返回值是在对话框关闭并且事件循环结束后返回的。
  • 对象生命周期QDialog对象(以及任何Qt对象)的生命周期是由其智能指针(如QSharedPointerQPointer,但更常见的是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、总结 前言&#xff1a; Qt框架中的QDialog类是一个功能强大且灵活的对话框控件&#xff0c;广泛应用于各种GUI&#xff08;图形用户界面&#xff09;应用程序中&#xff0c;用于处理用户输入、消…...

Spring 事务机制

1. 引言 1.1 什么是事务 事务是由用户定义的一系列操作序列所组成的最小工作单元&#xff1b;这些操作要么全部完成&#xff0c;要么全部不完成&#xff0c;是一个不可分割的工作单元。常见于数据库中的并发控制和数据一致性处理场景。 1.2 事务的特性 事务具有以下特性&am…...

Android 13 GMS 内置壁纸

如图&#xff0c;原生系统上&#xff0c;设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸&#xff0c;就显示默认的壁纸。点击进去就是预览页面 扩展下&#xff0c;默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…...

【LeetCode】234. 回文链表

回文链表 题目描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#…...

零基础学会机器学习,到底要多久?

这两天啊&#xff0c;有不少朋友和我说&#xff0c;想学机器学习&#xff0c;但是之前没有基础&#xff0c;不知道能不能学得会。 首先说结论&#xff0c;只要坚持&#xff0c;就能学会&#xff0c;但是一定不能三天打鱼两天晒网&#xff0c;要持之以恒&#xff0c;至少每隔两…...

视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?

安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台&#xff0c;支持多种视频格式和编码方式&#xff08;H.264/H.265&#xff09;&#xff0c;能够轻松对接各类前端监控设备&#xff0c;实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…...

Qt解析XML

背景 本来想解析VS的项目配置文件(*.vcxproj)&#xff0c;配合cppclean来发现多余的#incldue。 结果发现低估了难度&#xff0c;VS会间接引入许多目录。 略有不甘&#xff0c;暂且作为一个解析XML文件的示例。 代码 VSProjectParser.h #include <QVector> #include…...

PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解

Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码&#xff0c;我们试试暴力破解 image-20240807122743025 开始爆破了&#xff0c;全部失败&#xff0c;哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…...

OpenCV—二值化Threshold()、adaptiveThreshold()

cv2.threshold() c&#xff1a;double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注&#xff1a;源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src&#xff1a;源图片…...

第二天:java面向对象编程(OOP)

第二天&#xff1a;java面向对象编程&#xff08;OOP&#xff09; 1. 深入理解OOP四大特性 封装&#xff08;Encapsulation&#xff09;&#xff1a;学习如何将数据&#xff08;属性&#xff09;和操作数据的方法&#xff08;行为&#xff09;组合成一个独立的单元&#xff0…...

Selenium + Python 自动化测试07(滑块的操作方法)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 本篇文章主要讲述如何操作滑块。 目前很多系统登录或者注册的页面都有滑块相关的验证&#xff0c;selenium 中对滑块的基本操作采用了元素的拖曳的方式。需要用到Actiochains模…...

三防平板满足多样化定制为工业领域打造硬件解决方案

在当今工业领域&#xff0c;数字化、智能化的发展趋势日益显著&#xff0c;对于高效、可靠且适应各种复杂环境的硬件设备需求不断增长。三防平板作为一种具有坚固耐用、防水防尘防摔特性的工业级设备&#xff0c;正以其出色的性能和多样化的定制能力&#xff0c;为不同行业的应…...

pytorch,用lenet5识别cifar10数据集(训练+测试+单张图片识别)

目录 LeNet-5 LeNet-5 结构 CIFAR-10 pytorch实现 lenet模型 训练模型 1.导入数据 2.训练模型 3.测试模型 测试单张图片 代码 运行结果 LeNet-5 LeNet-5 是由 Yann LeCun 等人在 1998 年提出的一种经典卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;主要…...

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初始化&#xff08;带头结点&#xff09;不带头结点 2.2入队&#xff08;带头结点&#xff09;2.3出队&#xff08;带头结点&#xff09;❗2.4链队列c实例 3.双端队列考点:输出序列合法性栈双端队列 队列的应用1.树的层次遍历2.图的广度优先遍历3.操作系统…...

技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定

作者&#xff1a;Rachel Kang 排版&#xff1a;Alan Wang 在当今的应用开发领域&#xff0c;通过利用本机功能来扩展 .NET 应用程序的能力非常宝贵。.NET MAUI 处理程序架构使开发人员能够使用 .NET 代码直接操作本机控件&#xff0c;甚至允许无缝创建跨平台自定义控件。然而&a…...

Linux笔记 --- 标准IO

系统IO的最大特点一个是更具通用性&#xff0c;不管是普通文件、管道文件、设备节点文件、接字文件等等都可以使用&#xff0c;另一个是他的简约性&#xff0c;对文件内数据的读写在任何情况下都是带任何格式的&#xff0c;而且数据的读写也都没有经过任何缓冲处理&#xff0c;…...

洛谷:B3625 迷宫寻路

迷宫寻路 题目描述 机器猫被困在一个矩形迷宫里。 迷宫可以视为一个 n m n\times m nm 矩阵&#xff0c;每个位置要么是空地&#xff0c;要么是墙。机器猫只能从一个空地走到其上、下、左、右的空地。 机器猫初始时位于 ( 1 , 1 ) (1, 1) (1,1) 的位置&#xff0c;问能否…...

【C#】explicit、implicit与operator

字面解释 explicit&#xff1a;清楚明白的;易于理解的;(说话)清晰的&#xff0c;明确的;直言的;坦率的;直截了当的;不隐晦的;不含糊的。 implicit&#xff1a;含蓄的;不直接言明的;成为一部分的;内含的;完全的;无疑问的。 operator&#xff1a;操作人员;技工;电话员;接线员;…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...