《九》Qt各种对话框之QColorDialog

前言

        QColorDialog类继承于QDialog,是一个设计用来选择颜色的对话框部件。

QColorDialog

在介绍 QColorDialog 之前,我们先简单介绍一下 QColor 类。QColor 类用于表示颜色,支持 RGB(红绿蓝)三原色表示,也支持其他颜色模型表示,例如 HSV (hue 色调, saturation 饱和度, value 明亮度),CMYK(cyan 青, magenta 紫或叫品红, yellow 黄,  black 黑)。HSV 常用于描述人眼对颜色的感官,CMYK 常用于绘画或彩色印刷的颜料配置。计算机显示则更多地使用 RGB 三原色,下面我们主要介绍 RGB 的颜色模型相关函数内容。
针对半透明显示的特效,颜色也可以使用第四个分量,Alpha 通道,表示半透明程度,与三原色一起就是 ARGB。QColor 对象的构造或修改如下:

QColor(int r, int g, int b, int a = 255)  //根据红、绿、蓝、Alpha构造颜色对象
void    setRgb(int r, int g, int b, int a = 255) //设置红、绿、蓝、Alpha 值
int    red() const      //获取红色分量
int    green() const  //获取绿色分量
int    blue() const    //获取蓝色分量
int    alpha() const  //获取Alpha分量
void    getRgb(int * r, int * g, int * b, int * a = 0) const  //一次性读取四个通道值到参数指针指向的变量

颜色除了数值的表示方法,还可以仿照 HTML/CSS 网页中的颜色表述,比如 RGB 使用字符串表示 "#112233" ,这里是十六进制字符串表示,ARGB 表示为  "#ff112233" ,字符串表述的颜色设置和获取函数如下:

QString QColor::​name() const   //获取字符串表示的颜色,如 "#RRGGBB"
void QColor::​setNamedColor(const QString & name)  //设置字符串表示的颜色,如 "#RRGGBB"

QColor 对象如果初始化时没有设置任何颜色,那么处于不合法状态,可以使用下面函数判断:

bool QColor::​isValid() const

如果颜色合法,返回 true ,如果不合法,返回 false。

下面介绍 QColorDialog 对话框,QColorDialog 用于获取颜色,比如标签控件的前景色、背景色等,都可以通过 QColorDialog 获取颜色,然后修改界面控件的配色。QColorDialog 获取的颜色使用 QColor 对象返回。QColorDialog 颜色对话框如下图所示:

对话框左上角是基本颜色的网格,点击颜色网格可以获取基本颜色,右边则是大片的渐变颜色区域,渐变颜色区域每一个点都是一种颜色。对话框左下角可以添 加自定义的新 颜色到网格中,方便下次选取。右下角的 Red、Green、Blue 三色编辑框也可以修改颜色分量的值。HTML 编辑框内容就是当前颜色对应网页字符串的颜色描述方式。
颜色对话框有两种使用方式,一种是自定义对话框对象进行弹窗,第二种是使用对话框的静态函数弹窗。第二种静态函数的使用方式更为便捷。 

(1)QColorDialog 普通成员函数

颜色对话框继承基类 QDialog 所有的函数,可以模态显示,也可以非模态显示,exec()、show() 等函数与基类一样。
颜色对话框的构造和析构函数如下:

QColorDialog(QWidget * parent = 0)
QColorDialog(const QColor & initial, QWidget * parent = 0)
~QColorDialog()

 第一个构造函数参数只是设置父窗口指针,第二个构造函数可以指定一个初始颜色值,在弹窗时默认选中这个颜色。
颜色对话框获取颜色的普通成员函数分两种场景,第一种场景是在对话框保持显示时,用户点击的颜色:

QColor    currentColor() const   //获取当前颜色
void    setCurrentColor(const QColor & color)   //设置当前颜色
void    currentColorChanged(const QColor & color)  //信号,当前颜色变化时触发该信号

如果是非模态显示的自定义颜色对话框,那么使用上面函数可以随时获取用户点选颜色的变化。

第二种场景获取颜色的普通函数,是需要用户点击“OK”按钮确认后,最终返回的颜色:

QColor    selectedColor() const   //用户选择颜色并且点击 “OK”确认后返回的颜色值
void    colorSelected(const QColor & color) //信号,用户选择颜色并且点击 “OK”确认后,触发该信号

用户点击“OK”按钮后对话框就自动关闭了,selectedColor() 是最终选择的颜色,而前面的 currentColor() 可以一直变化选择。

QColorDialog 重载了基类的打开函数:

void QColorDialog::​open(QObject * receiver, const char * member)

这个打开函数参数里第一个 receiver 是接收 colorSelected() 信号的对象,第二个 member 就是一次性关联的槽函数名称。这个 open() 函数是一次性的,如果关闭了,那么 receiver 对象 member  槽函数会自动解绑。

QColorDialog 还可以设置特殊的颜色对话框选项:

ColorDialogOptions    options() const  //获取颜色对话框选项
void    setOptions(ColorDialogOptions options)   //设置颜色对话框选项
void    setOption(ColorDialogOption option, bool on = true)  //开启或禁用一个选项标志位
bool    testOption(ColorDialogOption option) const  //测试一个选项标志位是否为 true

具体的 ColorDialogOptions  枚举常量如下:

这些 ColorDialogOptions 都是二进制标志位,默认情况都是 0 ,除了有特殊需求情况,一般不使用这些标志位。
以上普通成员函数都是自定义对话框对象使用,实际中使用下面的静态函数模态显示更为方便。 

(2)QColorDialog 静态成员函数 

颜色对话框的静态函数就是针对静态函数内部临时定义的对话框对象,每次都是模态弹出: 

QColor    getColor(const QColor & initial = Qt::white, QWidget * parent = 0, const QString & title = QString(), ColorDialogOptions options = 0)   //静态函数

 静态函数 getColor() 参数里,initial 是初始选中的颜色,parent 是父窗口指针,title 是颜色对话框的标题文本,options 就是上面表格中的 ColorDialogOptions 标志位设置。
使用简单的一个函数就能获取一个颜色,这是非常方便使用的,例如:

QColor clr = QColorDialog::getColor();

这样一句简单代码就可以获取到颜色值。
注意 QColorDialog::getColor() 对话框显示时,如果用户按下 Cancel 按钮或者 Esc 键,那么会返回非法值的颜色对象,所以要注意判断返回值是否合法。
静态函数弹出的颜色对话框也可以进行一定的定制小操作,例如上面图片颜色对话框的左上角基本颜色网格,也叫 StandardColor ,可以进行修改:

QColor    standardColor(int index)   //静态函数,根据序号获取标准颜色(基本颜色)
void    setStandardColor(int index, QColor color)  //静态函数,根据序号设置标准颜色(基本颜色)

标准颜色网格或叫基本颜色网格,根据序号可以获取对应网格的颜色,也能修改网格颜色。
颜色对话框左下角的是 CustomColor ,就是用户定制颜色,初始时是空白的,用户选择某个颜色,点击“Add to Custom Colors ”按钮,就会添加到左下角的用户定制颜色网格。程序员也可以通过代码提前定制几个颜色:

int    customCount()   //静态函数,可以设置的用户定制颜色总数
QColor    customColor(int index)  //静态函数,根据序号获取用户定制颜色
void    setCustomColor(int index, QColor color)  //静态函数,根据序号设置用户定制颜色

 举例:

//头文件
#include<qpushbutton.h>
#include<QFrame>
#include<QColorDialog>
#include<QGridLayout>

//..........

private:
    QGridLayout *glayout;//定义布局
    QPushButton *colorbtn;//定义按钮

    //QFrame类是基本控件的基类,QWidget是QFrame类型
    QFrame *colorFrame;

private slots:
    void dispcolorFunc();
//源文件
    setWindowTitle("颜色对话框控件测试");
    this->setGeometry(200,100,500,400);

    glayout=new QGridLayout(this);
    colorbtn=new QPushButton("调用颜色对话框");
    colorFrame=new QFrame;

    colorFrame->setFrameShape(QFrame::Box);//设置形状
    colorFrame->setAutoFillBackground(true);//填充背景处理

    glayout->addWidget(colorbtn,0,0);
    glayout->addWidget(colorFrame,1,0);

    //槽函数链接
    connect(colorbtn,SIGNAL(clicked()),this,SLOT(dispcolorFunc()));

解释:

setWindowTitle(“颜色对话框控件测试”)是一个Qt的函数,用于设置窗口的标题为"颜色对话框控件测试"。this->setGeometry(200,100,500,400)是设置窗口的位置和大小,左上角坐标为(200,100),宽度为500,高度为400。

接下来的代码是创建一个QGridLayout布局管理器,并创建了一个QPushButton和一个QFrame控件。colorbtn是一个QPushButton,显示文本为"调用颜色对话框"。colorFrame是一个QFrame,用于显示颜色。

接着,使用glayout->addWidget()将colorbtn和colorFrame添加到布局管理器中,分别位于第一行和第二行的第一列。

最后,通过connect()函数将colorbtn的clicked信号与dispcolorFunc()槽函数进行连接,当colorbtn被点击时,会触发dispcolorFunc()函数的执行。

//槽函数
void Dialog::dispcolorFunc()
{
    QColor colorvalues=QColorDialog::getColor(Qt::red);

    if(colorvalues.isValid()){
        colorFrame->setPalette(QPalette(colorvalues));
    }
}

结果:

感谢阅读!!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】日期计算机

个人主页&#xff1a;救赎小恶魔 欢迎大家来到小恶魔频道 好久不见&#xff0c;甚是想念 今天我们要讲述的是一个日期类计算机的代码实现 引言&#xff1a; 我们日常生活中可能会有一个烦恼。 今天几月几号&#xff1f;过n天后又是几月几号&#xff1f;某年某月某天和x年…

PE文件的导入表,动态链接库中的函数应该如何导入

导入地址表IAT IAT保存的内容与windos操作系统的核心进程、内存、DLL结构有关。IAT是一种表格&#xff0c;用来记录程序正在使用哪些库中的哪些函数。 动态链接库(DLL) 常见的kernel.dll就是一个非常重要的动态链接库&#xff0c;其中包含了运行程序时需要使用到的函数&…

文件操作(1)

为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化的…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。…

JavaScript 数学对象 Math

Math对象其实就是数学对象&#xff0c;它给我们提供了各种各样的数学功能。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title> </head><body><script type"text/javascript"&g…

linux的“>”和“>>”

在Linux中&#xff0c;>和>>都是用于文件重定向的操作符&#xff0c;它们用于将命令的输出发送到文件中。 > 用于创建一个新文件或覆盖现有文件的内容。当你执行一个如 command > file.txt 的命令时&#xff0c;如果 file.txt 文件存在&#xff0c;它的内容将被…

【uniapp】引入uni-ui组件库

&#xff08;1&#xff09;新建项目的时候选择 uni-ui项目 &#xff08;2&#xff09;已经创建好的项目去官网单独安装 跳转单独安装组件 https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#%E9%80%9A%E8%BF%87-uni-modules-%E5%8D%95%E7%8B%AC%E5%AE%89%E8%A3%8…

YOLOv9训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv9系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【C++】如何用C++写一个日期计算器

目录 前言 代码的布局 设计数据 方法声明 方法的实现 获取某年某月的天数 *全缺省的构造函数 * 拷贝构造函数 *赋值运算符重载 *析构函数 日期天数 日期天数 日期-天数 日期-天数 前置 后置 后置-- 前置-- 实现比较大小运算符重载思路 >运算符重载 运算…

盲人餐厅点餐:科技之光照亮餐桌上的美食之旅

在现代社会&#xff0c;餐厅不仅是满足口腹之欲的场所&#xff0c;更是一个社交、放松的重要空间。然而&#xff0c;对于视障人士而言&#xff0c;盲人餐厅点餐这一日常行为&#xff0c;却往往伴随着诸多不便与挑战。幸运的是&#xff0c;科技的革新正为这一群体带来前所未有的…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

【第19章】spring-i8n

文章目录 前言一、准备二、Java国际化1.测试类2.测试结果 三、Spring国际化1.配置文件2.测试类3.测试结果4.占位符4.1 准备4.2 测试类4.3 测试结果 总结 前言 在Spring中实现国际化Internationalization&#xff08;i18n&#xff09;其实就是完成语言的切换&#xff0c;类似于…

4.SpringCloud基础项目搭建利用RestTemplate实现远程调用

简单的微服务架构 父pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

短信视频提取批量工具,免COOKIE,博主视频下载抓取,爬虫

痛点&#xff1a;关于看了好多市面的软件&#xff0c;必须要先登录自己的Dy号才能 然后找到自己的COOKIE 放入软件才可以继续搜索&#xff0c;并且无法避免长时间使用 会导致无法正常显示页面的问题。 有没有一种方法 直接可以使用软件&#xff0c;不用设置的COOKIE的方法呢 …

Linux驱动开发:掌握SPI通信机制

目录标题 1、SPI简介2、SPI通信机制3、Linux内核中的SPI支持4、SPI核心API5、SPI控制器驱动6、SPI设备驱动 7、编写SPI设备驱动8、调试SPI驱动 在Linux驱动开发中&#xff0c;串行外设接口(SPI)是一种常见的高速全双工通信协议&#xff0c;用于连接处理器和各种外设。本文将深入…

会声会影滤镜怎么用 会声会影滤镜效果怎么调 会声会影视频制作教程

在进行视频剪辑时&#xff0c;合理地运用滤镜效果可以提升视频的观赏性&#xff0c;使你的作品更加出彩。这篇文章便一起来学习会声会影滤镜怎么用&#xff0c;会声会影滤镜效果怎么调。 一、会声会影滤镜怎么用 使用会声会影的滤镜效果非常简单&#xff0c;以下是具体的操作…

Rust腐蚀服务器定制地图开服

Rust腐蚀服务器定制地图开服 大家好我是艾西一个做服务器租用的网络架构师。Rust腐蚀这个游戏有很多的插件mod作者&#xff0c;在地图制作这一块也是一样&#xff0c;有些好玩的地图可能大家在map网站找到了但是不知道怎么操作设置那么今天艾西给大家说下特定定制地图怎么弄。…

Penpad获Gate Labs以及Scroll联创Sandy的投资

近期&#xff0c;Scroll上的LaunchPad &聚合收益平台Penpad迎来了重磅利好&#xff0c;该平台在前不久获得了来自于Gate Las的融资&#xff0c;在此后其又获得了Scroll联合创始人Sandy的融资&#xff0c;这也让Penpad平台成为了近期Scroll生态中最值得关注的项目之一。 事实…