《九》Qt各种对话框之QColorDialog

news2024/12/22 4:26:00

前言

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

结果:

感谢阅读!!!!!

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

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

相关文章

使用Web3Modal2.0轻松集成多链钱包连接

随着区块链技术的快速发展&#xff0c;多链互操作性成为了一个重要的趋势。Web3Modal 2.0 作为一款强大的JavaScript库&#xff0c;为开发者提供了更加灵活和便捷的多链钱包集成解决方案。以下内容将介绍Web3Modal 2.0 的新特性&#xff0c;并详细讲解如何使用它来构建一个支持…

如何打造个性化支付宝小程序

支付宝小程序已成为企业与个人展示自身特色、连接用户的重要桥梁。想要快速拥有一个属于自己的支付宝小程序吗&#xff1f;别担心&#xff0c;今天就来分享一个简单又实用的方法——通过套用模板来轻松制作你的支付宝小程序。 选择一个靠谱的小程序模板开发平台是关键。国内主流…

yolov8 区域多类别计数

yolov8 区域多类别计数 1. 基础2. 计数功能2.1 计数模块2.2 判断模块 3. 初始代码4. 实验结果5. 完整代码6. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的&#xff0c;测距原理可见上边文章 2. 计数功能 2.1 计数模块 在指定区域内计数模块 region_point…

算法课程笔记——STL键值对map

map当下标无限的数组 重点是对应关系&#xff0c;一般不修改compare 类比set 没有lowerbound&#xff0c;因为遍历是无序的 ; map不能用sort函数排序 但可用vector转化为map使用 std::set<std::pair<TKEY, mutable TVAL> > ≈ std::map<TKEY, TVAL>

Java基础入门1-2

跟着韩顺平老师的30天入门java课程学习&#xff0c;整理一下自己的笔记&#xff0c;方便回顾知识点和复习。 另附上视频链接&#xff1a;0034_韩顺平Java_变量原理_哔哩哔哩_bilibili 第一章&#xff1a;学习前的了解 第二章&#xff1a;Java概述 2.1什么是程序&#xff1f…

C++ STL标准库,rotate函数详解

rotate翻译 rotate v.&#xff08;使&#xff09;旋转&#xff0c;&#xff08;使&#xff09;转动&#xff1b;&#xff08;人员&#xff09;轮换&#xff0c;轮值&#xff1b;轮种&#xff0c;轮作&#xff1b;定期调换地点&#xff08;或位置&#xff09;adj.&#xff08;…

【WSL】单机大模型前的基础环境配置

前言&#xff1a;在上一篇文章中&#xff0c;我们完成了WSL的部署&#xff0c;但是在大模型搭建&#xff08;尤其是Langchain&#xff09;前&#xff0c;还碰到了不少的坑&#xff0c;查找了不少的文章&#xff0c;所以本篇文章就做一个记录&#xff0c;避免以后再走冤枉路。 …

python学习笔记(集合)

知识点思维导图 # 直接使用{}进行创建 s{10,20,30,40} print(s)# 使用内置函数set()创建 sset() print(s)# 创建一个空的{}默认是字典类型 s{} print(s,type(s))sset(helloworld) print(s) sset([10,20,30]) print(s) s1set(range(1,10)) print(s1)print(max:,max(s1)) print(m…

入门指南:网站UI原型设计的简单方法

从零开始做网站UI原型设计&#xff0c;真的很有成就感&#xff01;那么&#xff0c;UI设计师从零开始做网站UI原型设计需要经历哪些过程呢&#xff1f;设计网站UI原型的第一步&#xff1a;绘制网站线框。本文将主要分为两个阶段&#xff1a;网站线框和原型绘制。 如何制作网站…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

SAP Fiori开发中的JavaScript基础知识15 - 原型,object,constructor,class,继承

1. 前言 本文将介绍JavaScript中的核心概念 - 原型&#xff0c;并会介绍基于原型的应用场景object&#xff0c;constructor&#xff0c;class&#xff0c;继承。 本文会将这几个核心概念汇总在一篇博客中&#xff0c;因为这些概念是触类旁通的&#xff0c;希望对你有帮助。 …

【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同理&…

CCF区块链会议--Middleware 2024 截止5.24 附录用率

会议名称&#xff1a;Middleware CCF等级&#xff1a;CCF B类会议 类别&#xff1a;软件工程/系统软件/程序设计语言 录用率&#xff1a;2022年录用率38%&#xff08;8/21&#xff09; Topics of Interest The Middleware conference seeks original submissions of resear…

销冠必备:高效跟进客户的四个技巧

作为一名销售&#xff0c;高效而精准地跟进客户是取得成功的关键。今天&#xff0c;我将分享四个技巧&#xff0c;让你也能够高效的跟进客户。 1、善于发问 通过多询问客户&#xff0c;你可以更好地了解客户的需求和痛点。在与客户交流时&#xff0c;不要只是简单地回答问题&…

SpringCloud基础 Consul的引入

前言 首先是为什么引入consul这个组件 我们知道微服务分为很多个模块,这里模块中相互调用,我使用硬编码的模式是不好的 比如微服务模块需要更新的时候,我们使用硬编码的方式可能需要修改很多个地方 但是使用consul之后,就引入了注册中心,我们只需要将对应的服务注册为节点 这样…

如何修复U盘在Windows 10上断开又重新连接的问题?这里有方法

序言 有时,当你把U盘连接到电脑上时,U盘每隔几秒钟就会断开连接并重新连接,这导致你无法正常复制和传输文件,这真的很烦人。硬件或驱动程序可能有问题。 在这种情况下,你需要确保此U盘与其他计算机是否正常工作。如果是,则表示你的驱动器没有问题。如果不是,不要担心。…

我们该如何看待AIGC(人工智能)

目录 AIGC的概述&#xff1a; AIGC的发展经历&#xff1a; AIGC的概述&#xff1a; [TOC]( &#x1f680;文章目录) ---AIGC全称为AI-Generated Content&#xff0c;指基于生成对抗网络GAN、大型预训练模型等人工智能技术&#xff0c;通过已有数据寻找规律&#xff0c;并通过…

服务网关GateWay基础

1. 网关基础介绍1.1 网关是什么1.2 为啥要用网关1.3 常见的网关组件NginxNetflix ZuulSpring Cloud GatewayKongAPISIX综合比较 2. gateWay的使用2.1 springCloud整合gateway2.2 GateWay的相关用法2.3 GateWay路由使用示例基本用法转发/重定向负载请求动态路由 2.5 断言(Predic…

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

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