【Qt】:Dialog 对话框

article/2025/8/15 18:51:55

在这里插入图片描述

📃个人主页:island1314

⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞

  • 生活总是不会一帆风顺,前进的道路也不会永远一马平川,如何面对挫折影响人生走向 – 《人民日报》

🔥 目录

    • 🌮 1. 基本介绍
    • 🌮 2. 对话框分类
      • 一、模态对话框
      • 二、非模态对话框
      • 三、混合模态对话框
    • 🌮 3. Qt 内置对话框
      • 一、QMessageBox -消息对话框
        • 二、QColorDialog -颜色对话框
        • 三、QFileDialog -文件对话框
        • 四、QFontDialog -字体对话框
        • 五、QInputDialog -输入对话框


🌮 1. 基本介绍

对话框 是 GUI 程序中不可或缺的组成部分。

  • 一些不适合在主窗口实现的功能组件可以设置在对话框中
  • 对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁(“短平快”)的用户交互。

Qt 常用的内置对话框有:

  • QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog (字体对话框)、QInputDialog (输入对话框)和 QMessageBox(消息框)

🌮 2. 对话框分类

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

一、模态对话框

模态对话框 指的是:显示后无法与父窗口进行交互,是⼀种阻塞式的对话框。使用 QDialog:: exec () 函数调用。

  • 模态对话框适用于必须依赖用户选择的场合,比如消息显示、文件选择、打印设置等。

示例:

  • A. 新建 Qt 项目,在 ui 文件中的菜单栏中设置两个菜单:“文件” 和 “编辑”,在菜单 “文件” 下新建菜单项:“创建” 并将菜单项 “新建” 置于工具栏中。

image-20250122213537109

  • B. 在 mainwindow.cpp 文件中实现:当点击 “新建” 时,弹出一个模态对话框

image-20250122213434667

说明:在菜单项中,点击菜单项时就会触发 triggered() 信号。

image-20250122214213232

二、非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用 QDialog::show() 函数调用。

  • 非模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的非模态对话框就会一闪而过。
  • 我们需要将 delete 和关闭按钮的点击信号关联起来,在用户点击关闭时触发 delete,Qt 为了让咱们写的方便, 直接给 QDialog 设置了一个属性,可以通过设置属性, 完成上述效果: Qt:WA_DeleteOnClose 属性(WAC)
  • 目的是:当创建多个非模态对话框时(如打开了多个非模态窗口),为了避免内存泄漏要设置此属性。

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等。
image-20250122214244806

三、混合模态对话框

混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。

  • 使用 QDialog::setModal() 函数可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的父组件。

image-20250122214826640

四、自定义对话框

这里我们设置以 QMainWindow 为基类之后,然后需要选择一个模板再建立文件,如下:

image-20250123094104784

image-20250123094200712

此时文件就会显示如下:

image-20250123094629646

代码实现如下:

image-20250123095028389

dialog.hpp 文件代码如下:

#include "dialog.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>Dialog::Dialog(QWidget* parent) : QDialog(parent)
{// 创建出一些控件, 加入到 Dialog 中. (以 Dialog 作为父窗口)QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("这是一个对话框", this);QPushButton* button = new QPushButton("关闭", this);layout->addWidget(label);layout->addWidget(button);connect(button, &QPushButton::clicked, this, &Dialog::handle);
}void Dialog::handle()
{this->close();
}

运行结果如下:

image-20250123095135827

🌮 3. Qt 内置对话框

Qt 提供了多种可复用的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于 QDialog类。常用标准对话框如下:

image-20250122215459113

一、QMessageBox -消息对话框

🔥 消息对话框 是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

QMessageBox 类 中定义了 静态成员函数,可以直接调用创建不同风格的消息对话框,其中包括:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对话框说明
Question用于正常操作过程中的提问
Information用于报告正常运行信息
Warning用于报告非关键错误
Critical用于报告严重错误

其对应的函数原型如下:

image-20250122230547776

【问题信息对话框】

image-20250122232132828

其中可以设置的按钮的类型如下:

image-20250122232151137

二、QColorDialog -颜色对话框

Qt QColorDialog 的功能就是内置了调色板,效果和下面看到的画图板的调色板非常类似。

  • 颜色对话框的功能是允许用户选择颜色。继承自 QDialog 类。颜色对话框如下图示:

image-20250123095256540

常用方法介绍:

  1. 创建对象的同时设置父对象

    • QColorDialog (QWidget *parent = nullptr)
  2. 创建对象的同时通过 QColor 对象设置默认颜色和父对象

    • QColorDialog(const QColor &initial, QWidget *parent = nullptr)
  3. 设置当前颜色对话框

    • void setCurrentColor(const QColor &color)
  4. 获取当前颜色对话框

    • QColor currentColor() const
  5. 打开颜色,选择对话框,并返回一个QColor对象

    1. QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())
      
    2. 参数说明:

      • initial:设置默认颜色

      • parent:设置父对象

      • title:设置对话框标题

      • options:设置选项

  6. 打开颜色对话框

    • void open(QObject *receiver, const char *member)

通过按钮修改窗口的背景色

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);resize(800, 600);QPushButton* btn = new QPushButton("颜色对话框", this);// 创建颜色对话框QColorDialog* cdlg = new QColorDialog(this);connect(btn, &QPushButton::clicked, [=](){// 打开颜色对话框 并且设置默认颜色为红色QColor color = cdlg->getColor(QColor(255, 0, 0));qDebug() << "r = " << color.red();qDebug() << "g = " << color.green();qDebug() << "b = " << color.blue();// 设置颜色对话框中的颜色cdlg->setCurrentColor(QColor(200, 100, 190));cdlg->open();});
}void MainWindow::on_pushButton_clicked()
{
//    QColorDialog* dialog = new QColorDialog(this);
//    dialog->exec();
//    delete dialog;// 函数的返回值就是用户选择的颜色.QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");qDebug() << color;// 可以基于用户选择的颜色, 修改窗口的背景色.// 可以通过 QSS 的方式设置背景色.
//    QString style = "background-color: rgb(" + QString::number(color.red()) + ", " + QString::number(color.green())
//            + ", " + QString::number(color.blue()) + ");";char style[1024] = { 0 };sprintf(style, "background-color: rgb(%d, %d, %d);", color.red(), color.green(), color.blue());this->setStyleSheet(style);
}

效果如下:

image-20250123101148949

三、QFileDialog -文件对话框

文件对话框用于应用程序中需要打开一个外部文件或需要将当前内容 存 储到指定的外部文件。

常用方法介绍:

  1. 打开文件(一次只能打开一个文件)
QString getOpenFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
  1. 打开多个文件(一次可以打开多个文件)
QStringList getOpenFileNames (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
  1. 保存文件
QString getSaveFileName (QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr, QFileDialog::Options options = Options())
  • 参数说明:

    • 参数 1:parent 父亲

    • 参数 2:caption 对话框标题

    • 参数 3:dir 默认打开的路径

    • 参数 4:filter 文件过滤器

【打开和保存文件】

这里的打开 / 保存功能都是需要额外去实现的,并不是说按了打开 / 保存就真的打开 / 保存了,这里我们演示一下打开功能,代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* button = new QPushButton("文件", this);QFileDialog* fdlg = new QFileDialog(this);connect(button, &QPushButton::clicked, [=](){QString str = fdlg->getOpenFileName(this, // 父亲"文件", // 文件对话框标题"D:\\Photo", // 打开路径"*.mp4"); // 打开时只显示 .mp4 格式文件});
}

效果如下:

image-20250123102323121

  • 此时打开的文件下只会显示 .mp4 文件,虽然该路径会把当前目录下的子目录也显示出来,但是子目录也只会显示 .mp4 文件
四、QFontDialog -字体对话框

Qt 中提供了预定义的字体对话框类 QFontDialog,用于提供选择字体的对话框部件。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton("字体", this);connect(btn, &QPushButton::clicked, [=](){// 使用 QFontDialog 类的静态方法 getFont 打开字体对话框并设置默认格式bool flag; // 由于 getFont 方法第一个参数是 bool 类型,QFont font = QFontDialog::getFont(&flag, QFont("华文行楷", 36));// 将 [char *] 转换为 [QString] 的方法qDebug() << "字体: " << font.family().toUtf8().data();// 获取字号qDebug() << "字号: " <<font.pointSize();// 判断字体是否加粗qDebug() << "是否加粗: " << font.bold();// 判断倾斜qDebug() << "是否倾斜: " << font.italic();});
}

效果如下:

image-20250123103314471

五、QInputDialog -输入对话框

Qt 中提供了预定义的输入对话框类:QInputDialog,用于进行临时数据输入的场合。

常用方法介绍:

A. 双精度浮点型输入数据对话框

double getDouble (QWidget *parent, const QString &title, const QString &label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())

B. 整型输入数据对话框

int getInt (QWidget *parent, const QString &title, const QString &label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());

C. 选择条目型输入数据框

QString getItem (QWidget *parent, const QString &title, const QString &label, const QStringList &items, int current = 0, bool editable = true, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(), Qt::InputMethodHints inputMethodHints = Qt::ImhNone)

参数说明:

  • parent:父亲
  • title:对话框标题
  • label:对话框标签
  • items:可供选择的条目
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* b_double = new QPushButton("浮点型输入框");connect(b_double, &QPushButton::clicked, [=](){double d = QInputDialog::getDouble(this, "输入框", "浮点型");qDebug() << "浮点型d = " << d;});QPushButton* b_int = new QPushButton("整型输入框");connect(b_int, &QPushButton::clicked, [=](){int i = QInputDialog::getInt(this, "输入框", "整数型");qDebug() << "整数型i = " << i;});QPushButton* b_item = new QPushButton("条目型输入框");connect(b_item, &QPushButton::clicked, [=](){QStringList items;// 两种输入方式items << tr("Spring") << tr("Summer") << tr("Fall");items.push_back("Winter");QString it = QInputDialog::getItem(this, "输入框", "条目型", items);qDebug() << "条目型it = " << it;});QVBoxLayout* lay = new QVBoxLayout();lay->addWidget(b_double);lay->addWidget(b_int);lay->addWidget(b_item);// 创建一个 QWidget 作为中心部件QWidget* centralWidget = new QWidget(this);centralWidget->setLayout(lay);  // 将布局设置到中心部件上// 将中心部件设置到 QMainWindow 上this->setCentralWidget(centralWidget);
}

效果如下:

image-20250123105310574

★,°:.☆( ̄▽ ̄)/$:.°★ 】那么本篇到此就结束啦,如果有不懂 和 发现问题的小伙伴可以在评论区说出来哦,同时我还会继续更新关于【Qt】的内容,请持续关注我 !!


http://www.hkcw.cn/article/WXWRPgkJgy.shtml

相关文章

【C++】详解vector二维数组的全部操作(超细图例解析!!!)

目录 一、前言 二、 深度理解vector 的二维数组&#xff08;重点&#xff01;&#xff09; 三、vector 二维数组的空间理解&#xff08;重点&#xff01;&#xff09; ✨问题分析 ✨如何合理定制vector的内存空间 四、vector 二维数组的初始化 五、vector 二维数组的 添加…

已解决 javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法,亲测有效!!!

已解决 javax.xml.transform.TransformerFactoryConfigurationError 异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 一、问题分析 二、报错原因 三、解决思路 四、解决方法 五、总结 博主v&#xff1a;XiaoMing_Java 博主v&#x…

【Python】FastAPI入门

文章目录 第一节&#xff1a;FastAPI入门一、FastAPI框架介绍什么是ASGI服务&#xff08;WSGI&#xff09;1、补充Web开发1&#xff09;Web前端开发2&#xff09;Web后端开发 二、FastAPI安装1、安装Python虚拟环境2、安装FastAPI 三、第一个FastAPI案例1、访问接口和文档2、接…

【C++】踏上C++学习之旅(四):细说“内联函数“的那些事

文章目录 前言1. "内联函数"被创造出来的意义2. 内联函数的概念2.1 内联函数在代码中的体现2.2 普通函数和内联函数的汇编代码 3. 内联函数的特性&#xff08;重点&#xff09;4. 总结 前言 本章来聊一聊C的创作者"本贾尼"大佬&#xff0c;为什么要创作出…

C++《string的模拟实现》

在之前的篇章C《string》中我们已经了解了string中关于构造、容量、访问、修改操作等函数的功能&#xff0c;以及初步学习了这些函数的使用该如何使用。通过学习string内的各个函数后我们可以发现在解决一些要使用到字符串的环境下有了string内的这些函数操作能大大简化&#x…

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2025年&#xff0c;已经开始使用AB卷题库&#xff0c;题目和往期一样&#xff0c;旧题加新题的组合&#xff0c;有题目第一时间更新&#xff0c;大家可以跟着继续学习&#xff0c;目前使用复用题较多&#xff0c;可在OJ上直接找到对应的AB卷学习&#xff0c;可以放心学习&#…

基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战

目录 前言 一、需求介绍 1、指定宽度生成 2、指定列自适应生成 二、Java生成实现 1、公共方法 2、指定宽度生成 3、指定列自适应生成 三、总结 前言 在当今数字化与信息化飞速发展的时代&#xff0c;图像的生成与处理技术正日益成为众多领域关注的焦点。从创意设计到数…

【C++】 —— 笔试刷题day_29

一、排序子序列 题目解析 一个数组的连续子序列&#xff0c;如果这个子序列是非递增或者非递减的&#xff1b;这个连续的子序列就是排序子序列。 现在给定一个数组&#xff0c;然后然我们判断这个子序列可以划分成多少个排序子序列。 例如&#xff1a;1 2 3 2 2 1 可以划分成 …

企业微信自建应用实现接收消息和发送消息功能(python)

# 这一周我不断的琢磨企业微信自建应用并且实现了自建应用的消息接收和发送功能 1.笔记&#xff0c;记录 第一步&#xff1a;打开企业微信后台 https://work.weixin.qq.com 1.1 如果没有企业可以在这里申请&#xff0c;如果有可以直接扫码登录 1.2 打开后台-应用管理-自建应用…

【Rust多线程】Rust并发编程,如何轻松实现无畏并发

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

2025粤港澳信息学创新大赛备考指南Python,C++,图形化历年真题训练题

官方指导文件 训练题目 ZCM5:Python小学组-单项选择题 1.小明安装软件的时候发现软件要求Windows环境&#xff0c;这 个要求限制的是? A.操作系统 B.计算机内存 C.网络设置 D.程序语言 答案‌&#xff1a;A. 操作系统 解析‌&#xff1a;软件运行的环境通常指的是操作系统&am…

【C++指南】“单身狗问题”——只出现一次的数字 系列问题

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 引言一、只出现一次的数字&#xff08;一&#xff09;简单题目描述解题思路代码实现及解释 二…

优化 InfluxDB 写入性能:高效批处理策略实战指南

在处理高吞吐量时序数据时&#xff0c;合理运用批处理&#xff08;Batching&#xff09;策略是提升 InfluxDB 写入性能的关键。本文介绍 时间驱动、大小驱动和混合批处理策略&#xff0c;并通过 Python 代码示例展示如何优化数据写入&#xff0c;平衡 延迟与吞吐量。同时&#…

RedwoodJS:乱拳打倒老师傅 NextJS!

RedwoodJS 是一个全栈的 JavaScript/TypeScript 框架&#xff0c;其作用是帮助开发者高效地构建现代化的 Web 应用。它将前端、后端和数据库集成在一起&#xff0c;并使用一种“JAMstack”架构&#xff08;JavaScript、API 和 Markup&#xff09;来构建可扩展的应用程序。 Star…

【C++】 —— 笔试刷题day_18

一、压缩字符串(一) 题目解析 题目给定一个字符str&#xff0c;让我们将这个字符串进行压缩&#xff1b; **压缩规则&#xff1a;**出现多次的字符压缩成字符数字&#xff1b;例如aaa压缩成a3。如果字符值出现一次&#xff0c;1不用写。 算法思路 这道题总的来说就非常简单了…

谷歌浏览器如何禁用javaScript

通过禁用js&#xff0c;可以访问一些设置权限的内容。 Chrome 地址栏输入 chrome://settings/content 回车。 找到 JavaScript 选项。 切换为 不允许网站使用 JavaScript。 地址栏输入&#xff1a; chrome://settings/content/javascript?searchJavaScript Firefox 地址栏输入…

Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦

Java从入门到“放弃”&#xff08;精通&#xff09;之旅&#x1f680;——类和对象全面解析⑦ 一、面向对象初探 1.1 什么是面向对象&#xff1f; Java是一门纯面向对象的语言(OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&am…

【Golang】第七弹----map

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 1基本介绍 Go语言中的 map …

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃? 2.2、从汇编代码的角度去理解多线程的执行细节,去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析dump时先从崩溃的那条汇…

基于谐波线性化方法的跟网型GFL并网变流器/VSC宽频序阻抗建模及扫频(Matlab/Simulink平台)及文献复现

目录 1、课程及模型介绍 2、谐波线性化方法介绍 3、跟网型及构网型并网变流器的特点 4、跟网型变流器/VSC拓扑及控制结构 5、不同坐标系下VSC序阻抗建模推导过程 5.1 abc三相坐标系下的VSC序阻抗建模 5.2 d-q旋转坐标系下的VSC序阻抗建模 5.2.1 Park变换及频率偏移效应…