QColor 理论使用总结
- 一、概述
- 1. 构造函数
- 2. 合法性校验
- 3. 组成值检索
- 二、整数与浮点精度
- 三、Alpha-Blended Alpha混合图
- 四、预定义颜色
- 五、扩展的RGB颜色模型
- 六、HSV颜色模型
- 七、HSL颜色模型
- 八、CMYK颜色模型
一、概述
QColor 是Qt里面描绘颜色的一个属性类,这个类是在Qt GUI模块里面的,这样就可以知道这个类是与GUI相关。像显示他背景颜色等等,在绘图的时候之类的都会用这个类。
在颜色理论体系中:一种颜色通常用RGB(红、绿、蓝)组成值来指定,但也可以用HSV(色调、饱和度和值)和CMYK(青色、品红、黄色和黑色)组成值来指定。此外,还可以使用颜色名称来指定颜色。颜色名称可以是SVG 1.0的任何颜色名称。
在不同的应用场景有不同的颜色体系,在界面很多使用这个类的时候,基本上都是用的RGB色系。传的参数也是三个值,最常用的就是这个构造函数。
1. 构造函数
QColor 构造函数根据RGB值创建颜色。要基于HSV或CMYK值创建QColor,分别使用 toHsv() 和 toCmyk()函数。这些函数使用所需格式返回颜色的副本。此外,静态的 fromRgb()、fromHsv()和fromCmyk() 函数根据指定的值创建颜色。
另外,可以使用convertTo()函数(返回所需格式的颜色副本)将颜色转换为三种格式中的任何一种,或者使用setRgb()、setHsv()和setCmyk()函数中的任何一种来更改该颜色的格式。spec()函数告诉我们如何指定颜色。
可以通过将RGB字符串(如 “#112233” )或 ARGB 字符串 (如 “#ff112233” ) 或颜色名称 (如 “蓝色” )传递给 setNamedColor() 函数来设置颜色。颜色名称取自 SVG 1.0 颜色名称。
函数的作用是:返回颜色的名称,格式为 “#RRGGBB”。颜色也可以使用 setRgb(), setHsv() 和 setCmyk() 来设置。要获得较浅或较深的颜色,分别使用 lighter() 和 deeper() 函数。
SVG 1.0 链接
下面是颜色的对应的关键名称
构造函数
QColor(const QColor &color)
QColor(QLatin1String name)
QColor(const char *name)
QColor(const QString &name)
QColor(QRgba64 rgba64)
QColor(QRgb color)
QColor(int r, int g, int b, int a = ...)
QColor(Qt::GlobalColor color)
静态函数
QColor fromCmyk(int c, int m, int y, int k, int a = 255)
QColor fromCmykF(qreal c, qreal m, qreal y, qreal k, qreal a = 1.0)
QColor fromHsl(int h, int s, int l, int a = 255)
QColor fromHslF(qreal h, qreal s, qreal l, qreal a = 1.0)
QColor fromHsv(int h, int s, int v, int a = 255)
QColor fromHsvF(qreal h, qreal s, qreal v, qreal a = 1.0)
QColor fromRgb(QRgb rgb)
QColor fromRgb(int r, int g, int b, int a = 255)
QColor fromRgba64(ushort r, ushort g, ushort b, ushort a = USHRT_MAX)
QColor fromRgba64(QRgba64 rgba64)
QColor fromRgbF(qreal r, qreal g, qreal b, qreal a = 1.0)
QColor fromRgba(QRgb rgba)
2. 合法性校验
isValid() 函数指示 QColor 是否合法。例如,超出RGB值范围的RGB颜色是非法的。出于性能原因,QColor通常忽略非法颜色,因此,使用无效颜色的结果是未定义的。
3. 组成值检索
颜色组成值可以单独检索,例如使用 red()、hue() 和 cyan()。也可以使用 getRgb()、getHsv() 和 getCmyk() 函数一次检索颜色组成值的值。使用RGB颜色模型,还可以使用RGB() 访问颜色组成值。
有几个相关的非成员:QRgb是一个代表RGB值三元组(r, g, b)的无符号整型的typdef。注意,它也可以保存alpha通道的值(更多信息,参见alpha混合绘图部分)。qRed()、qBlue()和qGreen()函数分别返回给定QRgb值的组成值,而QRgb()和qRgba()函数根据给定的组成值值创建并返回QRgb三元组。最后,qAlpha()函数返回所提供的QRgb的alpha分量,qGray()函数根据给定的值计算并返回一个灰度值。
QColor是平台和设备独立的。QColormap类将颜色映射到硬件。
二、整数与浮点精度
QColor支持浮点精度,并提供所有颜色组成值函数的浮点版本,例如getRgbF(), hueF()和frommykf()。请注意,由于组成值是使用16位整数存储的,因此使用(例如)setRgbF()设置的值与getRgbF()函数返回的值之间可能存在较小的偏差,这是由于舍入造成的。
基于整数的函数接受0-255范围内的值(hue()除外,它的值必须在0-359范围内),浮点函数接受0.0 - 1.0范围内的值。
三、Alpha-Blended Alpha混合图
QColor还支持阿尔法混合轮廓和填充。颜色的alpha通道指定透明度效果,0表示完全透明的颜色,而255表示完全不透明的颜色。例如:
// Specify semi-transparent red
painter.setBrush(QColor(255, 0, 0, 127));
painter.drawRect(0, 0, width()/2, height());
// Specify semi-transparent blue
painter.setBrush(QColor(0, 0, 255, 127));
painter.drawRect(0, 0, width(), height()/2);
上面的代码产生以下输出:
如果它的值是整数,使用alphaF()和setAlphaF()函数,如果它的值是qreal (double),则使用alphaF()和setAlphaF()函数。缺省情况下,alpha-channel设置为255(不透明)。要一次检索和设置所有RGB颜色组成值(包括alpha通道),请使用rgba()和setRgba()函数。
四、预定义颜色
在QColorConstants名称空间中有20个预定义的QColor对象,包括黑色、白色、主要和次要颜色、这些颜色的较深版本以及三种灰色。此外,QColorConstants::Svg名称空间为标准Svg颜色关键字名称定义了QColor对象。
QColorConstants::Color0、QColorConstants::Color1和QColorConstants::Transparent颜色用于特殊目的。
QColorConstants::Color0(零像素值)和QColorConstants::Color1(非零像素值)是在qbitmap中绘制的特殊颜色。使用QColorConstants::Color0设置位图位为0(透明;例如,背景),并使用c{QColorConstants::Color1}将位数设置为1 (opaque;例如,前景)。
QColorConstants: Transparent用于表示透明像素。当使用此值进行绘制时,将使用适合所使用的底层像素格式的像素值。
由于历史原因,这20种预定义的颜色也可以在Qt::GlobalColor枚举中使用。
最后,QColor识别各种颜色名称(作为字符串);静态colorNames()函数返回QColor知道的QStringList颜色名称。
五、扩展的RGB颜色模型
扩展的RGB颜色模型,也称为scRGB颜色空间,与RGB颜色模型相同,只是它允许低于0.0和大于1.0的值。这样就可以表示在RGB色彩空间范围之外的颜色,但仍然对RGB色彩空间内的颜色使用相同的值。
六、HSV颜色模型
RGB模型是面向硬件的。它的表现与大多数监视器显示的接近。相比之下,HSV表示颜色的方式更适合人类对颜色的感知。例如,“比强”、“比暗”和“相反”的关系在HSV中很容易表达,但在RGB中却很难表达。
HSV和RGB一样,有三个组成部分:
-
H表示色相,如果颜色是彩色的(不是灰色的),则在0到359的范围内,如果是灰色则没有意义。它代表了大多数人熟悉的色轮上的度数。红色是0度,绿色是120度,蓝色是240度。
-
S表示饱和度,在0到255的范围内,它越大,颜色越强。灰色的颜色饱和度接近0;非常强烈的颜色饱和度接近255。
-
V表示值,取值范围为0到255,表示颜色的明度或亮度。0是黑色;255离黑色越远越好。
这里有一些例子:纯红色是H=0, S=255, V=255;深红色,稍微向品红移动,可能是H=350(相当于-10),S=255, V=180;浅灰红色的H值约为0(例如350-359或0-10),S值约为50-100,S=255。
对于消色差的颜色,Qt返回色相值-1。如果您传递的色调值太大,Qt将强制它进入范围。Hue 360或720被视为0;Hue 540被视为180。
除了标准的HSV模型之外,Qt还提供了一个alpha通道来实现alpha混合绘图。
七、HSL颜色模型
HSL类似于HSV,但是代替Value参数,HSL指定了一个亮度参数,该参数映射到颜色的亮度有些不同。
同样,对于同一种颜色,HSL的饱和度值通常与HSV的饱和度值不相同。hslSaturation()提供颜色的HSL饱和度值,而saturation()和hsvSaturation()提供HSV饱和度值。
色调值在HSL和HSV中被定义为相同的。
八、CMYK颜色模型
虽然RGB和HSV颜色模型用于计算机显示器上的显示,但CMYK模型用于印刷机和一些硬拷贝设备的四色印刷过程。
CMYK有四个成分,都在0-255的范围内:青色©,品红(M),黄色(Y)和黑色(K)。青色,品红和黄色被称为减色;CMYK颜色模型通过从白色表面开始,然后通过应用适当的组成值减去颜色来创建颜色。青色、品红和黄色的组合可以得到黑色,而减去一种或多种则可以得到其他颜色。当以不同的百分比组合时,这三种颜色可以创造出整个颜色光谱。
将100%的青色、品红和黄色混合确实会产生黑色,但结果并不令人满意,因为它浪费油墨,增加干燥时间,并且在印刷时呈现浑浊的颜色。因此,在专业印刷中添加黑色以提供纯黑色色调;因此有了“四色处理”这个术语。
除了标准的CMYK模型之外,Qt还提供了一个alpha通道来实现alpha混合绘图。