【Qt】对话框QDialog

news2024/11/15 1:42:38

文章目录

  • **对话框**QDialog
    • **基本概念**
    • 对话框分类
    • 标准对话框
    • 自定义消息框
      • 模态对话框
      • 非模态对话框
    • 案例:点击新建按钮弹出对话框
    • 消息对话框
    • 其它标准对话框

对话框QDialog

基本概念

对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互


Qt 中使用QDialog类实现对话框,像主窗口一样,我们通常会设计一个类继承QDialog:

QDialog(及其子类,以及所有Qt::Dialog类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。

  • 顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置

对话框分类

对话框分为模态对话框和非模态对话框

  • 模态对话框:会阻塞同一应用程序中其它窗口的输入。比如:“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的
  • 非模态对话框:创建对话框后可以对其他窗口进行操作。例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑

标准对话框

标准对话框,是 Qt 内置的一系列对话框,比如有很多对话框都是通用的,比如打开文件、设置颜色、打印设置等

Qt 的内置对话框大致分为以下几类:

  • Q C o l o r D i a l o g QColorDialog QColorDialog: 选择颜色
  • Q F i l e D i a l o g QFileDialog QFileDialog: 选择文件或者目录
  • Q F o n t D i a l o g QFontDialog QFontDialog: 选择字体
  • Q I n p u t D i a l o g QInputDialog QInputDialog: 允许用户输入一个值,并将其值返回
  • Q M e s s a g e B o x QMessageBox QMessageBox: 模态对话框,用于显示信息、询问问题等
  • Q P a g e S e t u p D i a l o g QPageSetupDialog QPageSetupDialog: 为打印机提供纸张相关的选项
  • Q P r i n t D i a l o g QPrintDialog QPrintDialog: 打印机配置
  • Q P r i n t P r e v i e w D i a l o g QPrintPreviewDialog QPrintPreviewDialog:打印预览
  • Q P r o g r e s s D i a l o g QProgressDialog QProgressDialog: 显示操作过程

自定义消息框

Qt 支持模态对话框和非模态对话框:

  • 使用 Q D i a l o g : : e x e c ( ) QDialog::exec() QDialog::exec()实现应用程序级别的模态对话框
  • 使用 Q D i a l o g : : o p e n ( ) QDialog::open() QDialog::open()实现窗口级别的模态对话框
  • 使用 Q D i a l o g : : s h o w ( ) QDialog::show() QDialog::show()实现非模态对话框

模态对话框

应用程序级别的模态 => 默认的方式

当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口

窗口级别的模态

该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式


例子:

QDialog dialog;
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.exec();

调用了exec()将对话框显示出来,当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框,这是一个模态对话框


非模态对话框

QDialog dialog(this);
dialog.setWindowTitle(tr("Hello, dialog!"));
dialog.show();//将exec()修改为show()

现象:对话框竟然一闪而过,因为show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行

注意:此时dialog 是建立在栈上的,dialog 超出作用域被析构,因此对话框消失了,将 dialog 改成堆上建立,当然就没有这个问题了

QDialog *dialog = new QDialog(this);
dialog->setWindowTitle(tr("Hello, dialog!"));
dialog->show();

此时仍有一个问题:此时是将对话框设置到对象树上,但是如果对内存占用有严格限制的话,当我们将主窗口作为 parent 时,主窗口不关闭,对话框就不会被销毁,所以会一直占用内存

解决办法:setAttribute()函数设置对话框关闭时,自动销毁对话框。

dialog->setAttribute(Qt::WA_DeleteOnClose);

案例:点击新建按钮弹出对话框

ui界面如下

image-20231004193213355

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //案例:点击新建按钮=>弹出对话框
    connect(ui->actionNew,&QAction::triggered,[=](){
        //case1:创建模态对话框
        /*
            QDialog dlg(this);
            dlg.resize(200,100);//调整对话框大小
            dlg.exec();//阻塞 此时不可以对其它窗口进行操作
            qDebug() <<"模态对话框弹出";//关闭了对话框才会输出这句话
        */

        //case2:创建非模态对话框
        QDialog* dlg = new QDialog(this);
        dlg->resize(100,200);
        dlg->show();
        dlg->setAttribute(Qt::WA_DeleteOnClose);
        qDebug() <<"非模态对话框弹出";
    });
}

注意:为什么窗口模态对话框的时候,QDialog对象在栈上创建,而创建非模态对话框的时候在堆上创建?

  • 因为模态对话框会阻塞当前其它窗口操作,只有当前对话框关闭了才能操作其它窗口,所以该局部变量在对话框关闭前始终有效
  • 而非模态对话框不会阻塞当前其它窗口操作,如果dialog对象是建立在栈上的,dialog 超出作用域被析构,因此对话框消失了,所以要将 dialog 改成堆上建立

创建非模态对话框细节处:因为当前这个对象是new出来的,交给对象树,该对象在窗口关闭的时候才会释放,如果有人不断的点击新建按钮,然后又关闭,每次都会创建一个新对象,可能导致内存泄漏,所以需要设置55号属性 Q t : : W A D e l e t e O n C l o s e Qt::WA_DeleteOnClose Qt::WADeleteOnClose =>在关闭对话框的时候就把对象释放掉


消息对话框

使用上述点击新建按钮,触发不同的反应:

错误对话框 =>本质是 模态对话框

QMessageBox::critical(this,"critical","错误");

image-20231004194037552

消息对话框

 QMessageBox::information(this,"info","信息");

image-20231004194127789

提问对话框

//参数1:父亲指针  参数2:对话框的标题  参数3:提示内容  参数4:关联的按键类型=>使用|运算指定对话框应该出现的按钮
//参数5:指定默认选择的按钮
if (QMessageBox::Save  ==  QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
    //该函数的返回值就是按键类型
    qDebug() << "选择的是保存";

}
else
{
    qDebug() << "选择的是取消";
}

image-20231004194302336


警告对话框

QMessageBox::warning(this,"warning","警告");

image-20231004194341839


其它标准对话框

颜色对话框

QColor color =  QColorDialog::getColor(QColor(255,0,0));
qDebug() << "r = " << color.red() << " g = " << color.green() << " b  = " << color.blue() ;//输出选择颜色的RGB

image-20231004194459806


文件对话框

//文件对话框  参数 1:父亲指针  参数2:标题   参数3:默认打开路径  参数4:需要过滤文件格式,只要该格式的文件 =>该参数可以省略
//返回值是 选取的文件的路径
QString str = QFileDialog::getOpenFileName(this,"打开文件","Z:","(*.txt)");
qDebug() << str;

image-20231004194713815


字体对话框

bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36)); //默认设置字体为华文彩云 36号字体
//QString转为char*的方法:  toUtf8().data()
qDebug() << "字体:" << font.family().toUtf8().data() << " 字号 "<< font.pointSize() << " 是否加粗"<< font.bold() << " 是否倾斜"<<font.italic();

image-20231004194805323


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将 Ordinals 与比特币智能合约集成:第 3 部分

基于 Ordinals 的 BSV-20 同质化代币 之前&#xff0c;我们展示了如何将比特币智能合约与 Ordinals 集成&#xff0c;Ordinals 可以被视为链上的 NFT。 在本文中&#xff0c;我们将展示如何将它们与同质化代币&#xff08;即 BSV-20 代币&#xff09;集成。 我们仍然以拍卖为例…

【业务功能篇 131】23种设计模式介绍

第一章 设计模式概述 1.1 代码质量好坏如何评价? 要想学习设计模式呢 我们就必须搞清楚设计模式到底在我们的编程过程中起到了怎样的作用,在编程世界中它处在一个什么样的位置,它到底是一种抽象的设计思想,还是一套具体的落地方案. 在学习设计模式之前呢 我们需要了解一下 代…

【轻松玩转MacOS】故障排除篇

引言 在使用 MacOS 时&#xff0c;遇到故障是在所难免的。不要担心&#xff0c;这篇文章将为您提供一些常见的故障排除步骤&#xff0c;并介绍如何联系苹果的支持团队寻求帮助。让我们一起来看看吧&#xff01; 一、常见的故障排除步骤 1.1 网络连接问题 如果你发现你的Mac…

中兴路由器mesh组网设置分享!没想到居然这么简单!

前段时间忙了几天&#xff0c;总算是搬进新家了&#xff0c;因为新家比之前租的房子大了许多&#xff0c;所以之前用的路由器已经是力不从心了&#xff0c;我把它放大厅里&#xff0c;除了离大厅最近的一个房间有信号&#xff0c;其他两个房间的信号微乎其微&#xff0c;就算连…

接口自动化测试,如何实现多套环境的自动化测试?

在敏捷迭代的项目中&#xff0c;通常会将后台服务部署到多套测试环境。那么在进行接口自动化测试时&#xff0c;则需要将服务器的域名进行配置。使用一套接口测试脚本&#xff0c;通过切换域名地址配置&#xff0c;实现多套环境的自动化测试。 实战练习 分别准备两套测试环境…

【Python语义分割】Segment Anything(SAM)模型介绍安装教程

1 Segment Anything介绍 1.1 概况 Meta AI 公司的 Segment Anything 模型是一项革命性的技术&#xff0c;该模型能够根据文本指令或图像识别&#xff0c;实现对任意物体的识别和分割。这一模型的推出&#xff0c;将极大地推动计算机视觉领域的发展&#xff0c;并使得图像分割技…

【网络安全 ---- 靶场搭建】凡诺企业网站管理系统靶场详细搭建过程(asp网站,练习Access数据库的 sql注入)

一&#xff0c;资源下载 百度网盘资源下载链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com…

离散型制造企业MES管理系统解决方案

随着制造业的快速发展&#xff0c;离散型制造企业面临着越来越多的挑战。多样性、生产批次、工序复杂性以及高度定制化等特点使得企业的生产管理变得越来越复杂。为了提高生产效率和管理效率&#xff0c;许多企业开始寻求合适的解决方案。本文将以离散型制造企业的特点为基础&a…

云剪辑解决方案,支持云端剪辑私有化部署

在当今的商业环境中&#xff0c;视频已经成为了企业宣传和品牌推广的重要工具。然而&#xff0c;视频制作技术开发部署的成本和复杂性却让许多企业望而却步。为了解决这个问题&#xff0c;美摄科技推出了云剪辑解决方案&#xff0c;这是一款专为企业设计的高效视频剪辑技术服务…

Vuex使用方式及异步问题处理

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.Vuex简介&#xff1a; 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…

水声功率放大器的应用场景有哪些

水声功率放大器是一种特殊的放大器&#xff0c;它专门用于放大水声信号&#xff0c;广泛应用于水声通信、水声传感、声纳等领域。下面将详细介绍水声功率放大器的应用场景及其重要性。 水声通信是水声功率放大器最常见的应用场景之一。水声通信是利用水作为传输介质进行通信的一…

JavaScript Web APIs第四天笔记

Web APIs - 第4天 进一步学习 DOM 相关知识&#xff0c;实现可交互的网页特效 能够插入、删除和替换元素节点能够依据元素节点关系查找节点 日期对象 掌握 Date 日期对象的使用&#xff0c;动态获取当前计算机的时间。 ECMAScript 中内置了获取系统时间的对象 Date&#xff…

Restclient-cpp库介绍和实际应用:爬取www.sohu.com

概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库&#xff0c;它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp&#xff0c;支持GET, POST, PUT, PATCH, DELETE, HEAD等方法&#xff0c;以及自定义HTTP头部&#xff0c;超时设置&#xff0c;代理服…

Python 人工智能 Machine Learning 机器学习基础知识点详细教程(更新中)

人工智能基本介绍 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。它试图了解智能的实质&#xff0c;并生产出一种新的能以人类智能相似的方式做出反应的智…

echart双柱状图

1.效果 2.代码 const option {baseOption: {// backgroundColor: #0e2147,timeline: {show: false,},color: [#f14f75, #2c7efa],title: {text: 自动派单使用情况分析,textStyle: {rich: {a: {fontSize: 16,fontWeight: 600,},},},subtext: "2023~2024",top: 3%,l…

redis 哨兵 sentinel(一)配置

sentinel巡查监控后台master主机是否故障&#xff0c;如果故障根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 sentinel 哨兵的功能 监控 监控主从redis库运行是否正常消息通知 哨兵可以将故障转移的结果发送给客户端故障转移 如果master异常&#xff0c;则…

传奇XO引擎架设教程

本教程只限于技术研究使用&#xff0c;请勿用于商业用途。 本站教程、资源皆在单机环境进行&#xff0c;仅供单机研究学习使用&#xff0c;下载后请于24小时内删除&#xff0c;或购买正版。 XO三端引擎架设教程 演示系统&#xff1a;Windows Server2012 演示地址&#xff1a;…

Day 4 C++

算术运算符重载 种类&#xff1a; - * / % #include <iostream>using namespace std;class Cacu {friend const Cacu operator(const Cacu &l,const Cacu &r);friend const Cacu operator-(const Cacu &l,const Cacu &r);friend const Cacu operator*…

这可是全网最全的华为认证零基础学习路线整理,最新版分享

网络工程师愈发重要的新时代&#xff0c;华为认证已经成为学习网工的重中之重。 全球企业数字化转型呈现从慢速试点到今天的倍增创新&#xff0c;技术应用从单一孤立的到各类技术的融合&#xff0c;网络作为企业数字化运营的基石&#xff0c;迎来联接和数据的爆炸式增长&#x…

归并排序 nO(lgn)

大家好&#xff0c;我是蓝胖子&#xff0c;我一直相信编程是一门实践性的技术&#xff0c;其中算法也不例外&#xff0c;初学者可能往往对它可望而不可及&#xff0c;觉得很难&#xff0c;学了又忘&#xff0c;忘其实是由于没有真正搞懂算法的应用场景&#xff0c;所以我准备出…