Qt 如何在声明性QML中对RGB定义的颜色进行去饱和

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

使用QtQuick,是否可以使用RGB定义的现有颜色,并在不使用Javascript的情况下对其进行去饱和度处理?

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

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