前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Qt】:Dialog 对话框

【Qt】:Dialog 对话框

作者头像
IsLand1314
发布于 2025-02-28 01:30:24
发布于 2025-02-28 01:30:24
35110
代码可运行
举报
文章被收录于专栏:学习之路学习之路
运行总次数:0
代码可运行

🌮 1. 基本介绍

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

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

Qt 常用的内置对话框有:

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

🌮 2. 对话框分类

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

一、模态对话框

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

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

示例:

  • A. 新建 Qt 项目,在 ui 文件中的菜单栏中设置两个菜单:“文件” 和 “编辑”,在菜单 “文件” 下新建菜单项:“创建” 并将菜单项 “新建” 置于工具栏中。
  • B. 在 mainwindow.cpp 文件中实现:当点击 “新建” 时,弹出一个模态对话框
image-20250122213434667
image-20250122213434667

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

image-20250122214213232
image-20250122214213232
二、非模态对话框

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

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

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

image-20250122214244806
image-20250122214244806
三、混合模态对话框

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

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

四、自定义对话框

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

image-20250123094104784
image-20250123094104784
image-20250123094200712
image-20250123094200712

此时文件就会显示如下:

image-20250123094629646
image-20250123094629646

代码实现如下:

image-20250123095028389
image-20250123095028389

dialog.hpp 文件代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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
image-20250123095135827

🌮 3. Qt 内置对话框

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

image-20250122215459113
image-20250122215459113
一、QMessageBox -消息对话框

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

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

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

对话框

说明

Question

用于正常操作过程中的提问

Information

用于报告正常运行信息

Warning

用于报告非关键错误

Critical

用于报告严重错误

其对应的函数原型如下:

image-20250122230547776
image-20250122230547776

【问题信息对话框】

image-20250122232132828
image-20250122232132828

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

image-20250122232151137
image-20250122232151137
二、QColorDialog -颜色对话框

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

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

常用方法介绍:

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

  • QColorDialog (QWidget *parent = nullptr)

创建对象的同时通过 QColor 对象设置默认颜色和父对象

  • QColorDialog(const QColor &initial, QWidget *parent = nullptr)

设置当前颜色对话框

  • void setCurrentColor(const QColor &color)

获取当前颜色对话框

  • QColor currentColor() const

打开颜色,选择对话框,并返回一个QColor对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, 
                const QString &title = QString(), 
                QColorDialog::ColorDialogOptions options = ColorDialogOptions())

参数说明:

  • initial:设置默认颜色
  • parent:设置父对象
  • title:设置对话框标题
  • options:设置选项

打开颜色对话框

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
image-20250123101148949
三、QFileDialog -文件对话框

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

常用方法介绍:

  1. 打开文件(一次只能打开一个文件)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 打开多个文件(一次可以打开多个文件)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 保存文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 文件过滤器

【打开和保存文件】

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
image-20250123102323121
  • 此时打开的文件下只会显示 .mp4 文件,虽然该路径会把当前目录下的子目录也显示出来,但是子目录也只会显示 .mp4 文件
四、QFontDialog -字体对话框

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
image-20250123103314471
五、QInputDialog -输入对话框

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

常用方法介绍:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 整型输入数据对话框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 选择条目型输入数据框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:可供选择的条目
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
image-20250123105310574
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
已关注大佬,是否可以 互粉,和给我这开源项目 https://github.com/youzeliang/rdb 给一个star
已关注大佬,是否可以 互粉,和给我这开源项目 https://github.com/youzeliang/rdb 给一个star
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【QT】Qt 窗口 (QMainWindow)
QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了一个预定义的布局。QMainWindow 包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中 各组件所处的位置:
YoungMLet
2024/07/16
7230
【QT】Qt 窗口 (QMainWindow)
【QT】Qt窗口(下)
消息对话框是非常常见常用的界面元素,主要用于为用户提示重要信息,强制用户进行选择操作 QMessageBox类中定义了静态成员函数有四个
s-little-monster
2024/11/01
2390
【QT】Qt窗口(下)
Qt入门系列(二)
选中mainWindow.cpp右键->在Explor中显示->粘贴进来(显示包含的目录)
用户9831583
2022/06/16
2.1K0
Qt入门系列(二)
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
2.4默认创建有窗口类,yWidget,基类有三种选择:QWidget、QMainWindowQDialog
Arya
2024/10/31
7430
QT入门学习——从信号和槽到对话框,各种控件以及自定义控件
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
【Python篇】PyQt5 超详细教程——由入门到精通(序篇) 【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)
半截诗
2024/10/09
2.3K0
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
PySide6 GUI 编程(30):其他常见对话框
密码学人CipherHUB
2024/08/21
2412
PySide6 GUI 编程(30):其他常见对话框
C/C++ Qt 自定义Dialog对话框组件应用
在上一篇博文 《C/C++ Qt 标准Dialog对话框组件应用》 中我给大家演示了如何使用Qt中内置的标准对话框组件实现基本的数据输入功能。
王 瑞
2022/12/23
8230
C/C++ Qt 自定义Dialog对话框组件应用
QT的基本知识「建议收藏」
QT是一个跨平台应用程序和UI开发框架。具体的安装以及源文件的下载这里不详细介绍。 要在QT界面上添加一个按钮,可以有两种方法:一个是直接拖放一个按钮即可;另一种则是通过程序来添加一种按钮。
全栈程序员站长
2022/08/29
6880
QT的基本知识「建议收藏」
Qt学习(二)------实例mynotepad制作
最近在看高老师的视频教程,自己跟着做了一个txt编辑器,功能很简单,能实现编辑,保存,撤销,复制粘贴等基础功能;关于那边有一些特效
致Great
2023/08/26
2480
Qt学习(二)------实例mynotepad制作
C/C++ Qt 标准Dialog对话框组件应用
在Qt中对话框分为两种形式,一种是标准对话框,另一种则是自定义对话框,在一般开发过程中标准对话框使用是最多的了,标准对话框一般包括 QMessageBox,QInputDialog,QFileDialog 这几种,这里我将总结本人在开发过程中常用到的标准对话框的使用技巧。
王 瑞
2022/12/23
8430
C/C++ Qt 标准Dialog对话框组件应用
9.QT-标准对话框
Qt提供的可复用的标准对话框,全部继承自QDialog类,如下图所示: QMessageBox:信息对话框,用于显示信息、询问问题等; QFileDialog:文件对话框 QColorDialog:颜
诺谦
2018/05/28
1.5K0
Qt标准对话框的使用
学习编程个人觉得还是得从代码谈起,一方面有利于加深理解,另一方面也方便使(摘)用(抄)。
mythsman
2022/11/14
6050
【QT】Qt窗口组成和初识对话框
QMainWindow包含一个菜单栏Menu Bar②,多个工具栏Tool Bars③,多个浮动窗口Dock Widgets,一个状态栏Status Bar⑤和一个中心部件Central Widget④ ①是Window Title
s-little-monster
2025/05/28
1270
【QT】Qt窗口组成和初识对话框
自定义Qt对话框
今天就简单简单写个自定义对话框分享给大家。 演示 上代码! 自定义对话框的使用: #include <QApplication> #include <QDebug> #include "Dialog
Qt君
2020/07/17
1.8K0
PyQt5 输入对话框QInputDialog
(int, bool ok) QInputDialog.getInt (QWidget parent, QString title, QString label, int value = 0, int min = -2147483647, int max = 2147483647, int step = 1, Qt.WindowFlags flags = 0)
用户6021899
2019/08/14
2.8K0
学习 QT 过程中的一些笔记
学习 QT 时候做的一些笔记 目录 目录 按钮常用控件 API QT 窗口体系 信号和槽 点击按钮关闭窗口 自定义信号和槽 当自定义信号和槽出现重载 无参信号和有参信号与槽连接 Lambda 表达式 利用 Lambda 表达式实现点击按钮关闭窗口 QMainWindow 菜单栏 工具栏 状态栏 标签控件 浮动窗口 核心部件 资源文件 对话框 话框分类: 标准对话框 其他标准对话框 界面布局 控件 按钮组 QListWidget 列表容器 按钮常用控件 API QPushButton * btn = new
HauHau
2022/01/12
1.3K0
Qt5实战第四篇:Qt5的对话框与窗口
在Qt5应用程序开发中,对话框(Dialog)和窗口(Window)是两种常见的用户界面元素。对话框用于与用户进行简短的交互,如确认操作、输入数据等;而窗口则通常用于展示应用程序的主要内容或提供复杂的交互界面。本文将详细介绍Qt5中对话框与窗口的创建、使用以及它们之间的区别和联系。
china马斯克
2024/12/27
4750
Qt 学习记录
[],标识一个 Lambda 的开始,这部分必须存在,不能省略。外部变量访问方式说明符只能使用定义 Lambda 为止时 Lambda 所在作用范围内可见的局部变量(包括 Lambda 所在类的 this)。外部变量访问方式说明符有以下形式:
小简
2023/01/04
7.4K0
Qt 学习记录
qdialog 返回值_QDialog 窗口级别模态(续)「建议收藏」
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说qdialog 返回值_QDialog 窗口级别模态(续)「建议收藏」,希望能够帮助大家进步!!!
Java架构师必看
2022/04/30
2.1K0
04 qt功能类、对话框类和文件操作
对于Qt而言,在实际的开发过程中, 1)开发者可能知道所要使用的类 ---- >帮助手册 —>索引 -->直接输入类名进行查找 2)开发者可能不知道所要使用的类,只知道开发需求文档 ----> 帮助 手册,按下图操作:
天天Lotay
2023/10/15
2990
04 qt功能类、对话框类和文件操作
相关推荐
【QT】Qt 窗口 (QMainWindow)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档