Qt_对话框QDialog的介绍

news2024/11/14 2:09:17

目录

1、新建项目对话框 

2、非模态对话框 

3、模态对话框

4、自定义对话框 

5、Qt内置对话框

5.1 消息对话框QMessageBox 

5.2 颜色对话框QColorDialog

5.3 文件对话框QFileDialog

5.4 字体对话框QFontDialog

5.5 输入对话框QInputDialog 

结语 


前言:

        在Qt中,对话框是图形化界面不可缺少的一部分,他的类是QDialog。对话框的作用是让用户处理临时、简洁的任务,通常让用户进行一些选择。对话框本质也是一个独立的窗口,他分为两类:1、模态对话框,2、非模态对话框。Qt中内置一些可以直接用的对话框,常用的有以下几种:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框)。当然还允许开发者继承QDialog类实现自定义对话框。

1、新建项目对话框 

        在Qt Creator中,可以在新建项目中选择新建QDialog类,如下图:

        新建完成后,运行程序可以得到一个界面,该界面的右上角有一个问号,表示该界面是对话框的基础界面:

        但是以上新建QDialog项目的做法是没有意义的,因为实际运用中对话框是以子窗口的身份出现在程序中的,往往是在主窗口中执行了某种逻辑,这时候才会跳出对话框,而上述将对话框作为主窗口则体现不出对话框的作用。因此下文的例子是在主窗口QMainWindow中通过new的形式,创建一个QDialog对象作为子窗口。

2、非模态对话框 

        非模态对话框是一种模式,表示对话框创建出来时不会限制用户对主窗口的操作,通俗来说,用户可以在对话框和主窗口之间进行切换,将这种模式称为非阻塞对话框。调用QDialog里的show()函数实现非模态对话框。

        实现一个按钮,只要该按钮被按下,则就会创建一个新的对话框,在QMainWindow.cpp实现代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    //创建对话框
    QDialog* dialog = new QDialog(this);
    //采用非模态
    dialog->show();
}

        运行结果:

        可以看到能够正常创建对话框,但是上述代码有一个问题:如果关闭了对话框,是不会自动释放该对话框对象的,如果在一个主窗口中点击了多次按钮,就会一直创建新的对话框对象,从而导致内存泄漏。解决方法是设置 Qt:WA_DeleteOnClose 属性,写法如下:

void MainWindow::on_pushButton_clicked()
{
    //创建对话框
    QDialog* dialog = new QDialog(this);
    //采用非模态
    dialog->show();
    //效果为:关闭对话框时自动调用delete进行释放
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}

3、模态对话框

        模态对话框表示弹出对话框时,用户只能在该对话框里进行操作,无法在该对话框存在的情况下去操作主窗口。使用模态对话框非常简单,将上述的show方法改成exec方法即可,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    //创建对话框
    QDialog* dialog = new QDialog(this);
    //采用模态
    dialog->exec();
    //关闭对话框时自动调用delete进行释放
    dialog->setAttribute(Qt::WA_DeleteOnClose);
}

        运行结果:

4、自定义对话框 

        上述例子中的对话框仅仅只是一个窗口,无法添加任何控件,而一个完整的对话框是要有自己的控件的,这样才能与用户进行交互,若要实现在对话框中加入控件,方法之一就是自定义一个继承QDialog的类,然后在该类的构造函数中new出控件即可完成添加。步骤如下:

        新建完成后,会自动生成如下文件和代码:


        现在只需要在对应的文件中添加相关代码即可,dialog.h代码如下:

#ifndef DIALOG_H
#define DIALOG_H

#include <QWidget>
#include <QDialog>

class dialog : public QDialog
{
    Q_OBJECT
public:
    dialog(QWidget* parent);
};

#endif // DIALOG_H

         dialog.cpp代码如下:

#include "dialog.h"
#include <QPushButton>
#include <QLabel>

dialog::dialog(QWidget* parent):QDialog(parent)
{
    QLabel* label = new QLabel("对话框标签",this);
    QPushButton* pushbutton = new QPushButton("对话框按钮",this);
    pushbutton->move(200,200);
}

        mainwindow.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    dialog* di = new dialog(this);
    di->show();
    di->setAttribute(Qt::WA_DeleteOnClose);
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

5、Qt内置对话框

         Qt内部提供了多种对话框类型,即Qt标准对话框,这些对话框的框架都已经设置好了,可以直接使用。Qt标准对话框全部继承自QDialog类,在QDialog的基础上进行功能添加,就如同一个自定义对话框,只不过他们的功能更加丰富。标准对话框如下图所示:

         注意:Qt内置对话框默认都具有模态性质的,即不需要调用exec函数就具有模态性质,同时也可以具有非模态的创建和销毁机制。

5.1 消息对话框QMessageBox 

        QMessageBox是图形化界面中常用的对话框,主要用于给用户展示某些信息,并强制用户进行选择操作。QMessageBox类中提供了setIcon()函数,该函数的作用是更改消息对话框的类型,通过传入QMessageBox提供的枚举类型来进行风格设置,有以下四种枚举对应四种风格:

Question
用于正常操作过程中的提问
Information
用于报告正常运⾏信息
Warning
用于报告⾮关键错误
Critical
用于报告严重错误

        测试代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建消息对话框
    QMessageBox* mes = new QMessageBox(this);
    //设置对话框标题
    mes->setWindowTitle("提示信息");
    //设置对话框的文本内容
    mes->setText("是否执行");
    //设置对话框类型
    mes->setIcon(QMessageBox::Information);
    //设置对话框的按钮
    mes->setStandardButtons(QMessageBox::Yes|QMessageBox::No);

    mes->show();//即使用show,这该对话框也是具有模态性质
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

        从上述可以得知,消息对话框的框架是建立好了的,我们的工作就是对其风格进行设置。 


        上述代码逻辑可以简化成一句代码,该代码如下:

QMessageBox::information(this,"提示信息","是否执行",QMessageBox::Yes|QMessageBox::No);

        这句代码的实现和上述代码的实现是一样的,只不过这种写法无法更改对话框中的细节,灵活度不够高。

5.2 颜色对话框QColorDialog

         颜色对话框的作用就是让开发者在该对话框中选择一种颜色,然后拿到该颜色的RGB值,因为在程序中,颜色都是以数值的方式表现的,所以要想在代码中进行上色,必须使用RGB值,而开发者无法记住每一个RGB值代表什么颜色,因此需要一个颜色展示框(颜色对话框)来供开发者选择。

        QColorDialog常用接口介绍如下:

//该接口的作用是打开颜⾊选择对话框,并返回⼀个QColor对象,该对象保存RGB值

QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, 
const QString&title = QString(), 
QColorDialog::ColorDialogOptions options = ColorDialogOptions())

//initial 表示给该颜色对话框设置一个初始的RGB
//parent 设置父对象
//title 设置对话框标题
//options 设置选项

        QColorDialog测试代码如下: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建一个按钮
    QPushButton* push = new QPushButton("按钮",this);

    //创建颜色对话框
    QColorDialog* color = new QColorDialog(this);
    //打开颜色对话框并获取到RGB值,该值存放在QColor的对象里,还可以设置对话框标题
    QColor c = color->getColor(QColor(0,255,0),this,"我们的颜色对话框");

    qDebug()<<c;

    //使用获取到的RGB值来设置按钮的颜色
    push->setStyleSheet("background-color:rgb("+ QString::number(c.red())
      +','+QString::number(c.green())+','+QString::number(c.blue())+");");
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

        可以发现按钮的背景颜色变成了绿色,但是打印信息并不是0,255,0,这是因为打印的方式是ARGB(A表示不透明度,意思是将RGB的值采用透明度的方式来展现),其中1表示完全不透明度,后面是以三个小数来表示RGB的值,其中1就对应到RBG的255,0对应到RBG的0。

5.3 文件对话框QFileDialog

        ⽂件对话框用于界面中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件中。打开文件的接口介绍如下:

//该接口打开一个文件并返回该文件的路径
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(),
constQString &dir = QString(), const QString &filter = QString(), 
QString *selectedFilter = nullptr,QFileDialog::Options options = Options())

//parent 表示父对象
//caption 表示对话框标题
//dir 表示要打开的路径
//filter 表示文件过滤器

        测试代码如下: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置一个按钮,点击该按钮就跳出文件对话框
    QPushButton* push = new QPushButton("打开文件",this);

    //创建一个文件对话框对象
    QFileDialog* file = new QFileDialog(this);

    //用lambda来实现槽函数
    connect(push,&QPushButton::clicked,this,[=](){
            QString s = file->getOpenFileName(this);
            qDebug()<<s;
    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

         getOpenFileName不仅可以打开文件对话框,还可以返回选择文件的路径。


        保存文件用的函数是getSaveFileName,他的用法和打开文件是一样的,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置一个按钮,点击该按钮就跳出文件对话框
    QPushButton* push = new QPushButton("保存文件",this);

    //创建一个文件对话框对象
    QFileDialog* file = new QFileDialog(this);

    //用lambda来实现槽函数
    connect(push,&QPushButton::clicked,this,[=](){
            QString s = file->getSaveFileName(this);
            qDebug()<<s;
    });

}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

5.4 字体对话框QFontDialog

         字体对话框的使用逻辑和颜色对话框有效相似,都是为了让开发者能够清楚的选择某些选项,然后将这些选项保存在一个对象中,供后续的使用。常用接口介绍如下:

static QFont getFont(bool *ok, const QFont &initial, 
QWidget *parent = nullptr, 
const QString &title = QString(),
FontDialogOptions options = FontDialogOptions());

//ok 表示对话框是否完成设置
//initial 表示设置对话框的默认值
//parent 表示对话框的父对象
//title 表示对话框标题
//options 表示对话框选项

        测试代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建一个文本对话框
    QFontDialog* font = new QFontDialog(this);

    //打开文本对话框,并设置默认值
    bool ok;
    QFont f = font->getFont(&ok,QFont("楷书",22),this);

    //打印f
    qDebug()<<ok;
    qDebug()<<f.family();//字体
    qDebug()<<f.pointSize();//字号
    qDebug()<<f.bold();//加粗
    qDebug()<<f.italic();//倾斜

}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

5.5 输入对话框QInputDialog 

        输入对话框就是让用户输入一些简单的数值,比如整形数据、浮点型数据,常用的输入对话框类型有以下几种:

1、双精度浮点型输⼊数据对话框-调用getDouble函数

2、整型输⼊数据对话框-调用getInt函数

3、条⽬型输⼊对话框-调用getItem函数

        以上的函数参数用法和之前的逻辑都相差不差,只要看下面代码例子就知道如何使用了。 


        测试双精度浮点型对话框:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QInputDialog* input = new QInputDialog(this);

    double tmp = input->getDouble(this,"双精度输入框","请选择一个数值",10);
    qDebug()<<tmp;
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

        可以点击右边的上下按钮对数值进行调整,也可以直接在输入框中自定义数值。


        整型对话框的逻辑和双精度浮点型对话框代码逻辑是一样的,只需要将函数更改为getInt就行,这里主要测试条目型输⼊对话框,这个对话框是选择字符串的,测试代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QInputDialog* input = new QInputDialog(this);
    
    //创建条目
    QStringList tmp;
    tmp<<tr("苹果")<<tr("香蕉")<<("西瓜");

    QString s = input->getItem(this,"整形输入框","请选择一个数值",tmp);
    qDebug()<<s;
}

MainWindow::~MainWindow()
{
    delete ui;
}

        运行结果:

结语 

        以上就是关于对话框QDialog的介绍,对话框作为图形化界面常用的控件之一,自然是非常重要的,这一点可以在实际使用中感受得到。主要掌握内置对话框尤为重要,因为内置对话框的使用场景较多,并且其已经是成品了所以用起来也方便。

        最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!! 

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

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

相关文章

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…

最佳植树距离 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;C卷D卷E卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 按照环保公司要求&#xff0c;小明需要在沙化严重的地区进行植树防沙工作&#xff0c;初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木&#xff0c;所以只能在…

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

stm32单片机个人学习笔记7(TIM定时中断)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

Python可迭代对象(1)---从C++开发者学习python日记

目录 1。什么是可迭代对象&#xff1f; 2。列表(list) 列表的创建 列表基本操作 以上全部代码的总运行结果 列表脚本操作符 列表常用的方法和函数 列表推导式 ​编辑列表的嵌套 以上全部代码的总运行结果 复习列表内容 3。元组(tuple) 元组的基本运算 元组的方法 …

SFUD库移植

1.源码 GitHub - armink/SFUD: An using JEDECs SFDP standard serial (SPI) flash universal driver library | 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2.介绍 这个通用驱动库,实际就是帮你封装好了读写spiflash的函数, 我们只需要对接以下底层,就可以轻松…

快速了解使用路由器

插槽的使用和用法&#xff1a;slot 为什么要使用插槽&#xff1a; 在Vue.js等前端框架中 在Vue.js等前端框架中&#xff0c;插槽&#xff08;Slot&#xff09;是一种强大的工具&#xff0c;允许开发者在组件之间动态地传递和呈现内容。使用插槽的主要原因包括&#xff1a; …

【LTW】Domain General Face Forgery Detection by Learning to Weight

文章目录 Domain General Face Forgery Detection by Learning to Weightkey points方法LTW元分割策略学习过程损失函数实验评价结果消融实验总结Domain General Face Forgery Detection by Learning to Weight 会议:AAAI-21 作者: code: https://github.com/skJack/LTW 上…

用uniapp 及socket.io做一个简单聊天 升级 9

比这之前优化了以下功能 上线通知 群聊里适时显示在线人数 约请好友 通过好友通过socket 相应端自动变化 PC端可以拉取摄象头拍照 PC端可以录音发送 拉起摄象头发送录象 <template><view class""><scroll-view scroll-y"true" class&…

2024 离线ASR和TTS推荐与示例

2024 离线ASR和TTS推荐 文章目录 2024 离线ASR和TTS推荐一、前言二、安装与使用1、EdgeTTS的安装和使用&#xff08;1&#xff09;Edge TTS介绍与效果试听&#xff08;2&#xff09;Edge TTS安装&#xff08;3&#xff09;Edge TTS查看支持的音色&#xff08;4&#xff09;Edge…

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…

MySQL:事务的ACID特性隔离级别脏读/不可重复读/幻读/Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务&#xff1f; 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务&#xff0c;执行修改后回滚 5.3 开始一个事务&#xff0c;执行修…

set-ExecutionPolicy RemoteSigned 提示不是内部或外部命令,也不是可运行的程序或批处理文件

这个错误一般发生在使用命令提示符或者PowerShell窗口中找不到set-ExecutionPolicy RemoteSigned。如果你想在命令提示符或者PowerShell窗口运行set-ExecutionPolicy RemoteSigned&#xff0c;你需要搜索打开Window PowerShell ISE&#xff0c;并以管理员身份打开&#xff0c;输…

图结构感知的Transformer:一种新的图表示学习方法

人工智能咨询培训老师叶梓 转载标明出处 尽管图神经网络&#xff08;GNNs&#xff09;在处理图数据方面取得了显著成就&#xff0c;但它们在表达能力和捕获长距离依赖方面存在局限性。为了突破这些局限&#xff0c;研究者们开始探索将Transformer架构应用于图表示学习。在此基…

使用Electron打包一个Vue3项目全步骤

1.创建一个Vue3项目 2.使用 WebStorm打开项目&#xff0c;并安装依赖项 npm install 等待完成后&#xff0c; 安装electron npm install --save-dev electron 等待完成后&#xff0c; 安装electron 打包依赖项(打包成可执行文件) npm install electron-packager --save-dev 3…

从零开始一个git操作实例,图文并茂

徒弟不懂git怎么用&#xff0c; 于是写了篇文章&#xff0c; 把本地git操作从头写了一遍&#xff0c; 自己去看吧&#xff01; 0、基本概念 •Git是一个免费、开源的、分布式版本控制系统 •它使用一个特殊的叫做仓库的数据库来记录文件的变化 •仓库中的每个文件都有一个…

ccfcsp-202406(1、2、3、4、5)

矩阵重塑&#xff08;其一&#xff09; #include <bits/stdc.h> using namespace std; int main() {int n,m,p,q;cin >> n >> m >> p >> q;vector<int> vec(n * m);vector<vector<int>> res(p, vector(q,0));int k 0;for(in…

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…