Qt 如何在声明性QML中对RGB定义的颜色进行去饱和
使用QtQuick,是否可以使用RGB定义的现有颜色,并在不使用Javascript的情况下对其进行去饱和度处理?看看QtQuick是如何在Javascript引擎上运行的,我认为不使用Javascript就不可能在QML中做任何事情 为了调整饱和度,您必须将RGB转换为HSL颜色,然后再转换回RGB。QML为后者提供了Qt 如何在声明性QML中对RGB定义的颜色进行去饱和,qt,colors,qml,qtquick2,hsl,Qt,Colors,Qml,Qtquick2,Hsl,使用QtQuick,是否可以使用RGB定义的现有颜色,并在不使用Javascript的情况下对其进行去饱和度处理?看看QtQuick是如何在Javascript引擎上运行的,我认为不使用Javascript就不可能在QML中做任何事情 为了调整饱和度,您必须将RGB转换为HSL颜色,然后再转换回RGB。QML为后者提供了Qt.hsla(),但上次我检查时,它没有提供从RGB到HSL的转换,因此我最终使用了以下方法: function rgbToHsl(r, g, b) { r /= 255
Qt.hsla()
,但上次我检查时,它没有提供从RGB到HSL的转换,因此我最终使用了以下方法:
function rgbToHsl(r, g, b) {
r /= 255
g /= 255
b /= 255
var max = Math.max(r, g, b), min = Math.min(r, g, b)
var h, s, l = (max + min) / 2
if (max == min) {
h = s = 0
} else {
var d = max - min
s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0)
break
case g:
h = (b - r) / d + 2
break
case b:
h = (r - g) / d + 4
break
}
h /= 6;
}
return {"h":h, "s":s, "l":l};
}
看看QtQuick是如何在Javascript引擎上运行的,我想说,不借助Javascript就不可能在QML中做任何事情 为了调整饱和度,您必须将RGB转换为HSL颜色,然后再转换回RGB。QML为后者提供了
Qt.hsla()
,但上次我检查时,它没有提供从RGB到HSL的转换,因此我最终使用了以下方法:
function rgbToHsl(r, g, b) {
r /= 255
g /= 255
b /= 255
var max = Math.max(r, g, b), min = Math.min(r, g, b)
var h, s, l = (max + min) / 2
if (max == min) {
h = s = 0
} else {
var d = max - min
s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
switch (max) {
case r:
h = (g - b) / d + (g < b ? 6 : 0)
break
case g:
h = (b - r) / d + 2
break
case b:
h = (r - g) / d + 4
break
}
h /= 6;
}
return {"h":h, "s":s, "l":l};
}
只需修改颜色的
hsv饱和度
,或hsl饱和度
属性,具体取决于您的颜色
示例Test.qml
每秒逐渐对蓝色矩形进行去饱和(使用qmlscene Test.qml
运行):
隐藏在大量文本中,在两个代码块之间,这些属性实际上被记录在中。在C++中,它们对应于<代码> qReals/Cord>颜色组件属性(名称在<代码>……()(<代码> >)中的版本。
正如@dtech所说,
onTriggered:…
在法律上已经是一行JavaScript。如果必须,还可以在C++中向下行进,找到元素的属性,并修改其属性。
示例main.cpp
,显示了上面的Test.qml
,它从一个已经非常去饱和的蓝色矩形(纯C++)开始,然后逐渐去饱和(仍然用qml/JavaScript完成):
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
QQuickView视图(QUrl(QLatin1String(“qrc:/Test.qml”));
view.show();
如果(QObject*rectangle=view.rootObject()->findChild(“珍贵”))
{
qreal h,s,l,a;
矩形->属性(“颜色”).value().getHslF(&h,&s,&l,&a);
s*=0.2;
矩形->设置属性(“颜色”,QVariant::fromValue(QColor::fromHsvF(h,s,l,a));
}
返回app.exec();
}
现在可以从Test.qml
中删除JavaScript的明显行
请注意,我演示了一个非常粗糙的彩色动画。有一个特殊的
彩色动画
工具可以做得更好。只需修改颜色的hsv饱和度
或hsl饱和度
属性,具体取决于您的设置
示例Test.qml
每秒逐渐对蓝色矩形进行去饱和(使用qmlscene Test.qml
运行):
隐藏在大量文本中,在两个代码块之间,这些属性实际上被记录在中。在C++中,它们对应于<代码> qReals/Cord>颜色组件属性(名称在<代码>……()(<代码> >)中的版本。
正如@dtech所说,
onTriggered:…
在法律上已经是一行JavaScript。如果必须,还可以在C++中向下行进,找到元素的属性,并修改其属性。
示例main.cpp
,显示了上面的Test.qml
,它从一个已经非常去饱和的蓝色矩形(纯C++)开始,然后逐渐去饱和(仍然用qml/JavaScript完成):
#包括
#包括
#包括
int main(int argc,char*argv[])
{
QGUI应用程序应用程序(argc、argv);
QQuickView视图(QUrl(QLatin1String(“qrc:/Test.qml”));
view.show();
如果(QObject*rectangle=view.rootObject()->findChild(“珍贵”))
{
qreal h,s,l,a;
矩形->属性(“颜色”).value().getHslF(&h,&s,&l,&a);
s*=0.2;
矩形->设置属性(“颜色”,QVariant::fromValue(QColor::fromHsvF(h,s,l,a));
}
返回app.exec();
}
现在可以从Test.qml
中删除JavaScript的明显行
请注意,我演示了一个非常粗糙的彩色动画。有一个特殊的
彩色动画
工具可以做得更好。如果你只想去饱和屏幕上的东西,你可以使用如果你只想去饱和屏幕上的东西,你可以使用
function desaturate(colorString)
{
var c = Qt.darker(colorString, 1.0);
return Qt.hsla(c.hslHue, 0.0, c.hslLightness, c.a);
}
import QtQuick 2.7
Item {
width: 100
height: 100
Rectangle {
anchors.fill: parent
objectName: "precious"
color: "#0000FF"
Timer {
running: true
repeat: true
onTriggered: parent.color.hslSaturation *= 0.8;
}
}
}
#include <QGuiApplication>
#include <QQuickView>
#include <QQuickItem>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQuickView view(QUrl(QLatin1String("qrc:/Test.qml")));
view.show();
if ( QObject * rectangle = view.rootObject()->findChild<QObject*>("precious") )
{
qreal h, s, l, a;
rectangle->property("color").value<QColor>().getHslF( &h, &s, &l, &a );
s *= 0.2;
rectangle->setProperty( "color", QVariant::fromValue(QColor::fromHsvF( h, s, l, a )) );
}
return app.exec();
}