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都能满足需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396797.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年4月份我放弃了前端,转行了!!!猜我得到了什么?

为什么离开这个行业&#xff1f;最近在干什么&#xff1f; 为什么离开这个行业这个问题其实 我真的真的想了很多很多&#xff0c;我也分享给你们我的想法&#xff0c;希望可以帮助想继续深耕这个行业的继续深耕&#xff0c;犹豫想转行的帮助你们确定转行。 我能干什么&#x…

开源 AI 智能名片 S2B2C 商城小程序赋能下的社区团购商业模式研究

摘要&#xff1a;本文深入探讨了社区团购商业模式的本质、特点及其优势&#xff0c;并详细分析了开源 AI 智能名片 S2B2C 商城小程序在社区团购中的应用与价值。通过对相关案例的研究和数据的分析&#xff0c;揭示了这一创新组合对社区商业生态的重要影响&#xff0c;为未来社区…

FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

FFmpeg开发笔记&#xff08;四十五&#xff09;使用SRT Streamer开启APP直播推流 合集 - FFmpeg开发实战(46) 1.FFmpeg开发笔记&#xff08;一&#xff09;搭建Linux系统的开发环境2023-04-162.FFmpeg开发笔记&#xff08;二&#xff09;搭建Windows系统的开发环境2023-04-29…

深入探索 Wireshark——网络封包分析的利器

一、引言 在当今数字化的时代&#xff0c;网络通信变得日益复杂和关键。无论是企业的网络运维&#xff0c;还是网络安全研究&#xff0c;都需要深入了解网络中传输的数据。Wireshark 作为一款强大的网络封包分析工具&#xff0c;成为了网络工程师、安全研究人员和技术爱好者不…

8.6-设置mysql开机自启+角色生效+主从数据库

一、设置mysql开机自启 1.添加开机自启 #添加开机启动 [root004 mysql]# #systemctl enable mysqld [root004 mysql]# chkconfig --list注&#xff1a;该输出结果只显示 SysV 服务&#xff0c;并不包含 原生 systemd 服务。SysV 配置数据 可能被原生 systemd 配置覆盖。 要列…

【C语言】位段详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段&#xff1f; 二、…

Leetcode面试经典150题-2.两数相加

解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val …

ubuntu插入模块测试

文章目录 一、环境二、步骤 一、环境 ubuntu 20.04 内核版本&#xff1a;5.15-generic 二、步骤 先看一下ubuntu用的哪个内核版本&#xff1a; 到内核目录下&#xff1a; 随便建个文件夹存一下编译完的ko模块&#xff1a; 写测试代码&#xff1a; 写makefile&#xff1a;…

Flink-DataWorks第六部分:数据运维(第62天)

系列文章目录 运维中心 4.1 功能概述 4.2 操作流程 4.2.1 操作流程概览 4.2.2 步骤一&#xff1a;查看周期任务配置 4.2.3 步骤二&#xff1a;测试周期任务 4.2.4 步骤三&#xff1a;周期任务补历史数据 4.2.5 步骤四&#xff1a;查看周期实例 4.2.6 步骤五&#xff1a;查看执…

knn图像分类

K近邻算法(K-NN)&#xff0c;即给定一个已训练的数据集&#xff0c;对新的输入实例&#xff0c;在训练数据集中找到与该实例最邻近的K个实例&#xff0c;这K个实例的多数属于某个类&#xff0c;则判定该输入实例同属此类。 1. OpenCV K近邻模块的使用 接下来通过一个例子&…

掌握 Nuxt 3 的页面元数据:使用 definePageMeta 进行自定义配置

title: 掌握 Nuxt 3 的页面元数据&#xff1a;使用 definePageMeta 进行自定义配置 date: 2024/8/11 updated: 2024/8/11 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍Nuxt 3框架中definePageMeta的使用方法&#xff0c;包括如何为页面组件定义元数据&#xff0…

集合的框架(之一)

集合的含义&#xff1a; 集合是一个可变的容器&#xff0c;可以随时向集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提供了若干个用来操作集合中数据的方法。集合里的数据&#xff0c;我们称之为元素(elements)&#xff1b;集合只能用来存储…

2025年美国数学竞赛AMC8暑期备考:吃透625道真题和知识点(持续)

距离接下来最近的2025年AMC8美国数学竞赛还有几个月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;可以…

1915_开源C语言实现的通用队列

经常在工作中遇到一些队列处理的场景&#xff0c;以前要么是借用FreeRTOS这样的系统中的相关功能&#xff0c;要么是通过数组做一个简单的队列模型。但是&#xff0c;这两种方案都具有一定的局限性能&#xff0c;前者要求的FreeRTOS不见得相应的软件中有&#xff0c;而后者只能…

超好玩的肉鸽游戏:《暴君的游戏》手机单机游戏分享

《暴君的游戏》&#xff08;Despots Game&#xff09;是一款结合了自走棋和roguelike元素的像素策略冒险游戏。游戏以其独特的战斗系统和丰富的职业选择&#xff0c;为玩家提供了深度的策略体验和探索乐趣。 游戏特色包括&#xff1a; 角色职业多样性&#xff1a;玩家可以招募…

使用历史版本比对法排查C++程序中的内存泄漏问题

目录 1、问题描述 2、使用Process Explorer实时查看程序的虚拟内存占用 2.1、对于内存泄漏问题,需要查看程序占用的虚拟内存 2.2、Windows任务管理器中看不到程序进程占用的虚拟内存,使用Process Explorer工具可以看到 2.3、通过Process Explorer工具看到每次泄漏的内存…

大数据-75 Kafka 高级特性 稳定性-一致性保证 LogAndOffset(LEO) HightWatermark(HW) 水位/水印

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

LVS实战项目

LVS简介 LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层SLB(Server LoadBalance)是基于LVSkeepalived实现。 LVS集群的类型 lvs-nat &#xff1a; 修改请求报文的目标IP, 多目标 IP 的 DNAT lvs-dr &#xff…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——6Resnet实现黑线识别

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——6Resnet实现黑线识别 ​ 比赛还有重要部分就是黑线的识别&#xff0c;这块地平线社区的帖子很多 ​ 在本次我就使用了社区吴超大佬写出的文章&#xff0c;当然我们的步骤有所不同&#xff0c;也是比较省…

黄牛杀手 抢票脚本 V3.0

黄牛杀手 抢票脚本 V3.0 介绍 现在黄牛太tm多了&#xff0c;根本抢不到票 为了解决这个问题&#xff0c;开发了这个脚本&#xff0c;支持大麦网&#xff0c;淘票票、缤玩岛等多个平台 依赖 selenium (4.10.0以下版本) pip install selenium 现在黄牛太tm多了&#xff0c;根…