【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用

小编个人主页详情<---请点击
小编个人gitee代码仓库<---请点击
Qt系列专栏<---请点击
倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己!


目录


前言

【Qt】Qt窗口(六)QMessageBox消息对话框的使用------书接上文 详情请点击<------,本文会在上文的基础上进行讲解,所以对上文不了解的读者友友请点击前方的蓝字链接进行学习

本文由小编为大家介绍------【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用


一、QColorDialog

基于QColorDialog让用户选择颜色,修改窗口的背景色

  1. QColorDialog用于给用户弹出一个颜色对话框,用于让用户选择一个颜色,那么关于颜色我们需要事先学习一下计算机中的颜色rgb 关于计算机中的颜色rgb,在第三点QWidget的styleSheet属性中的计算机中的颜色中进行的讲解,详情请点击<------
  2. 对于用户来讲用户也不知道计算机中的颜色rgb是什么意思呀,所以像这种颜色对话框QColorDialog一般都会内置一个调色板,我们打开电脑的画图板,上方的选项中有一个编辑颜色,点开就是一个调色板,用户可以自由的在这个调色板上选择一种颜色,然后点击确定,QColorDialog内置的调色板的功能就和这里的画图的调色板的功能类似
  3. 那么QColorDialog颜色对话框长什么样子,又该如何使用呢?所以接下来我们创建一个项目名为QColorDialog,基类为QMainWindow,派生类为MainWindow的项目,接下来我们点击ui文件,进入Qt Designer
  4. 所以此时我们拖拽左侧红框内的按钮控件,然后调整成上图界面即可,objectName保持不变,接下来我们右击按钮,然后点击转到槽,接下来我们选择clicked信号,让Qt帮我们生成对应槽函数的声明和定义
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>


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

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


void MainWindow::on_pushButton_clicked()
{
    QColorDialog* dialog = new QColorDialog(this);
    dialog->exec();
    delete dialog;
}
  1. 所以此时我们创建一个QColorDialog颜色对话框对象,然后使用exec以模态的方式显示颜色对话框,此时颜色对话框就要给用户显示一个调色板了,用户就可以进行选择一种颜色,当用户选择完成点击确定之后,颜色对话框才会关闭,由于是模态方式运行的颜色对话框,所以此时我们调用delete析构颜色对话框对象即可,不会出现一闪而过的现象

运行结果如下

  1. 此时用户点击MainWindow上的按钮,此时就会弹出一个颜色对话框,此时在调色板上,用户就可以选择自己喜欢的一种颜色了,选择好之后,此时用户点击颜色对话框上的确定即可
  2. 所以呢,用户选择好了一种颜色,问题来了,我们该如何拿到用户选择的那一种颜色呢?
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>

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

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


void MainWindow::on_pushButton_clicked()
{
    QColorDialog* dialog = new QColorDialog(this);
    dialog->exec();

    QColor color = dialog->currentColor();

    delete dialog;

    qDebug() << color;

}
  1. 我们可以使用currentColor获取用户当前在颜色对话框中选择的颜色,currentColor的返回值是一个QColor对象,Qt中对于这些概念,比如颜色都封装成为了一个类,所以我们使用QColor接收currentColor的返回值,接下来使用qDebug()打印颜色即可

运行结果如下

  1. 所以此时我们就可以顺利的拿到用户在颜色对话框上选择的颜色了
  1. 此时我们就要来探究一下QColor的含义了,我们之前学习的计算机的颜色是采用rgb来进行表示的,r红色,g绿色,b蓝色,而QColor中的颜色是采用ARGB进行表示的,对于后面的RGB我们可以理解,分别代表红色,绿色,蓝色,但是前面的A是什么意思呢?
  2. 对于这里的A,其实是alpha不透明度,也就是对应颜色的不透明度,和小编之前讲解的opacity一致,关于通过QPushButton按钮来控制窗口的不透明度opacity,在第一点中QWidget的windowOpacity属性中进行的讲解,详情请点击<------
  3. 但是还有问题,诸如rgb之前的取值范围不是0到255嘛,为什么这里却成了浮点数呢,其实这也是rgb的一种表示方式,这里的浮点数的取值范围是0到1,所以浮点数的0也就对应整数的0,浮点数的1也就对应整数的255,没有问题
  4. 但是实际场景中,我们并不会以之前在QDialog中的这种形式去创建颜色对话框,获取用户在颜色对话框上选择的颜色,而是采用一种更简洁的方式进行获取,那么就是采用QColorDialog自己提供的静态方法getColor,关于这里的静态方法getColor也就类似于小编在消息对话框中使用的静态方法warning一样,不需要我们创建对话框对象,就可以直接进行使用
  5. getColor这个函数可以弹出一个模态的颜色对话框,也就是说getColor在内部帮我们创建好QColorDialog对象,设置好属性,并且以exec模态方式运行,此时用户在模态对话框中选择一种颜色,点击确定之后,对话框就会关闭,而我们注意上图中getColor的返回值就是QColor对象,即此时getColor的返回值就是用户选择的颜色值,对于getColor我们需要依次传入调色板上默认选择的颜色值,父元素,消息对话框的标题
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>

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

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


void MainWindow::on_pushButton_clicked()
{
//    QColorDialog* dialog = new QColorDialog(this);
//    dialog->exec();
//    QColor color = dialog->currentColor();
//    delete dialog;
//    qDebug() << color;

    QColor color = QColorDialog::getColor(QColor(255, 0, 0), this, "请选择颜色");

    qDebug() << color << '\n';





}
  1. 所以此时我们将按钮的clicked信号对应的槽函数中原来的代码注释掉,此时我们调用QColorDialog类的静态成员函数getColor,那么我们对于第一个参数传入一个QColor对象,对于构造一个QColor对象,需要传入三个参数,分别是RGB,以整数的形式进行传入,所以对于三个参数依次传入红色拉满255,绿色0,蓝色0即可
  2. 接下来对于getColor第二个参数我们传入父元素MainWindow对应的this指针即可,对于第三个参数我们传入一个QColorDialog消息对话框的标题,我们传入请选择颜色,接下来我们使用QColor对象获取getColor的返回值即可,此时一旦getColor返回,就代表此时用户选择了颜色,那么颜色的结果就被保存在QColor对象中,所以此时我们使用qDebug()打印一下即可

运行结果如下

  1. 此时用户点击MainWindow上的按钮,此时就会弹出一个颜色对话框,此时在调色板上,用户就可以选择自己喜欢的一种颜色了,选择好之后,此时点击颜色对话框上的确定即可
  2. 那么接下来通过getColor的返回值,我们就可以拿到当初用户在颜色对话框中选择的颜色,此时使用日志也就将用户选择的颜色打印出来了
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>

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

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


void MainWindow::on_pushButton_clicked()
{
//    QColorDialog* dialog = new QColorDialog(this);
//    dialog->exec();
//    QColor color = dialog->currentColor();
//    delete dialog;
//    qDebug() << color;

    QColor color = QColorDialog::getColor(QColor(255, 0, 0), this, "请选择颜色");

    qDebug() << color << '\n';

    QString style = "background-color: rgb(" + QString::number(color.red()) + ", " + QString::number(color.green()) + ", " +
            QString::number(color.blue()) + ");";
    

    this->setStyleSheet(style);

}
  1. 此时我们已经可以成功的获取用户在颜色对话框上选择的颜色了,所以我们想要基于QColorDialog让用户选择颜色后,根据用户选择的颜色去修改窗口的背景色,关于背景色的设置我们可以通过QSS的方式进行设置,而要想使用QSS需要先学习styleSheet属性 关于和QSS相关的styleSheet属性,在第三点QWidget的styleSheet属性中进行的讲解,详情请点击<------
  2. 而设置背景色background-color可以通过rgb的方式进行设置,这里rgb的三个参数需要都是整数的形式,例如red就是以整数的形式获取,以redF的方式就是以浮点数的形式获取,这里我们选择使用red,green,blue整数的形式获取rgb,background-color: rgb(x, x, x); 所以接下来我们通过字符串拼接的方式拼接成前面格式的字符串,然后通过setStyleSheet将拼接好的字符串设置进MainWindow主窗口中即可

运行结果如下

  1. 此时用户点击MainWindow上的按钮,此时就会弹出一个颜色对话框,此时在调色板上,用户就可以选择自己喜欢的一种颜色了,选择好之后,此时点击颜色对话框上的确定即可
  2. 那么接下来通过getColor的返回值,我们就可以拿到当初用户在颜色对话框中选择的颜色,此时使用QSS的方式通过setStyleSheet就可以将用户选择的颜色设置进主窗口MainWindow的背景色中,没有问题
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>

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

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


void MainWindow::on_pushButton_clicked()
{
//    QColorDialog* dialog = new QColorDialog(this);
//    dialog->exec();
//    QColor color = dialog->currentColor();
//    delete dialog;
//    qDebug() << color;

    QColor color = QColorDialog::getColor(QColor(255, 0, 0), this, "请选择颜色");

    qDebug() << color << '\n';

//    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);

}
  1. 可是小编,通过上述字符串拼接的方式有点太抽象了,有没有比较简洁明了的方式进行字符串的拼接呢?有的,别忘了我们在Qt中也可以使用我们之前学习的C/C++中的接口呀,所以我们可以使用C语言库中提供的sprintf,关于这个sprintf的使用方式其实很简单,在我们之前使用的printf的前面,也就是第一个参数的位置传入要拼接的字符串的缓冲区即可
  2. 所以此时我们创建一个1024字节的char类型的数组style,然后将这个char类型的数组style作为一个缓冲区传入给sprintf的第一个参数中即可,所以此时我们只需要再传入字符串background-color: rgb(%d, %d, %d); 然后依次使用red,green,blue依次取出用户选择颜色对应的rgb的整数值进行传入即可

运行结果如下

  1. 此时用户点击MainWindow上的按钮,此时就会弹出一个颜色对话框,此时在调色板上,用户就可以选择自己喜欢的一种颜色了,选择好之后,此时点击颜色对话框上的确定即可
  2. 那么接下来通过getColor的返回值,我们就可以拿到当初用户在颜色对话框中选择的颜色,此时使用QSS的方式通过setStyleSheet就可以将用户选择的颜色设置进主窗口MainWindow的背景色中,没有问题

二、QFileDialog

基于QFileDialog获取打开文件路径,获取保存文件路径

  1. 通过QFileDialog可以弹出一个文件对话框,用户可以选择这一个文件,选择之后,我们可以通过QFileDialog获取到这个文件的路径,常用场景有两种,分别是打开文件,保存文件,所以接下来我们创建一个项目名为QFileDialog,基类为QMainWindow,派生类为MainWindow的项目,接下来我们点击ui文件,进入Qt Designer
  2. 所以此时我们拖拽左侧红框内的按钮控件,然后调整成上图界面即可,objectName保持不变,接下来我们右击两个按钮,然后点击转到槽,接下来我们选择clicked信号,让Qt帮我们生成对应槽函数的声明和定义
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDebug>


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

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


void MainWindow::on_pushButton_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this);

    qDebug() << filePath << '\n';
}

void MainWindow::on_pushButton_2_clicked()
{
    QString filePath = QFileDialog::getSaveFileName(this);

    qDebug() << filePath << '\n';
}
  1. 那么按钮clicked信号对应的槽函数中,首先是对于打开文件对话框的按钮,这里要弹出一个打开文件对话框,那么这里我们可以使用QFileDialog提供的静态函数getOpenFileName,这个静态函数getOpenFileName会创建一个打开文件对话框对象,设置相关的属性,然后以模态的方式运行这个打开文件对话框,这里我们关注第一个参数,也就是传入父元素的指针,用于挂接到对象树上,那么getOpenFileName的返回值就是用户打开的文件路径,其实还有getOpenFileNames可以一次打开多个文件,由于getOpenFileNames和getOpenFileName的用法一致,所以这里小编仅仅讲解getOpenFileName即可
  2. 所以我们给getOpenFileName的第一个参数传入父元素MainWindow窗口对应的this指针即可,接下来使用QString对象接收打开文件的路径,最后我们使用qDebug()打印一下打开文件的路径即可
  3. 那么按钮clicked信号对应的槽函数中,对于保存文件对话框的按钮,这里要弹出一个保存文件对话框,那么这里我们可以使用QFileDialog提供的静态函数getSaveFileName,这个静态函数getSaveFileName会创建一个保存文件对话框对象,设置相关的属性,然后以模态的方式运行个保存文件对话框,这里我们关注第一个参数,也就是传入父元素的指针,用于挂接到对象树上,那么getSaveFileName的返回值就是用户保存的文件路径
  4. 所以我们给getSaveFileName的第一个参数传入父元素MainWindow窗口对应的this指针即可,接下来使用QString对象接保存文件的路径,最后我们使用qDebug()打印一下保存文件的路径即可

运行结果如下

  1. 所以此时我们点击MainWindow主窗口上的按钮,此时就可以弹出一个打开文件对话框,所以此时我们选择好文件,点击确定即可,此时打开文件的路径就被日志打印出来了

  2. 同理此时我们点击MainWindow主窗口上的按钮,此时就可以弹出一个保存文件对话框,所以此时我们输入要保存的文件名,点击确定即可保存文件,此时保存文件的路径就被日志打印出来了

  3. 但是有没有细心的网友仔细观察,此时真的就去打开一个文件,保存一个文件了吗?没有,也就说这里的打开文件,保存文件的功能都需要是去额外实现的,这里就需要使用到文件操作了,这里关于文件操作小编就不展开讲解了

  4. 那么我们使用C/C++标准库中的文件操作也可以实现这里的文件操作功能,值得注意的是,其实Qt中也有针对文件的操作,等到在后面的文章中,在合适的时机小编会进行的讲解

  5. 同样的我们还会发现在文件对话框中还有一个All Files(*),在右侧可以进行下拉,下拉之后仍然是All Files(*),那么这个All Files(*)究竟是什么意思呢?其实是按照后缀匹配文件名的意思,其中的All Files(*)代表的是匹配全部后缀的文件名,小编所以换句话来讲,其实是可以匹配其它后缀的文件名,也就是按照后缀名筛选文件,是的

  6. 那么我们来看getOpenFileName的第四个参数为const QString&类型的参数filter,可以支持我们传入想要筛选的文件的后缀名,一旦设置后,那么在All Files(*)下就会出现有我们添加的文件的后缀名了,此时就可以按照文件名的后缀进行筛选文件了,这里小编就不展开讲解了,感兴趣的读者友友可以自行尝试一下


总结

以上就是今天的博客内容啦,希望对读者朋友们有帮助

水滴石穿,坚持就是胜利,读者朋友们可以点个关注

点赞收藏加关注,找到小编不迷路!

相关推荐
A charmer1 小时前
从 C++ 到 Objective-C:零基础平滑转学专栏【总目录】
开发语言·c++·objective-c
cookies_s_s1 小时前
C++ 内存模型与无锁编程:从底层原理到实战
linux·服务器·开发语言·c++
我在人间贩卖青春1 小时前
重学Qt——GUI程序设计
qt
wuyikeer1 小时前
Java进阶——IO 流
java·开发语言·python
jieyucx1 小时前
Go 切片核心:子切片详解(下篇)
开发语言·算法·golang·切片
阿里嘎多学长1 小时前
2026-05-02 GitHub 热点项目精选
开发语言·程序员·github·代码托管
alwaysrun1 小时前
C++之字符串视图string_view
开发语言·c++·字符串·string_view·字符串视图
fengxin_rou2 小时前
JVM 内存结构与内存溢出 / 泄漏问题全解析
java·开发语言·jvm·分布式·rabbitmq
城俊BLOG2 小时前
C++的注册机制和插件系统
java·服务器·c++