Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用QPropertyImation更改QPushButton的背景色_C++_Qt_Qpushbutton_Qpropertyanimation_Qcolor - Fatal编程技术网

C++ 使用QPropertyImation更改QPushButton的背景色

C++ 使用QPropertyImation更改QPushButton的背景色,c++,qt,qpushbutton,qpropertyanimation,qcolor,C++,Qt,Qpushbutton,Qpropertyanimation,Qcolor,我正在尝试对QPushButton单击事件应用柔和的颜色更改。我使用QPropertyImation的第一种方法非常有效 标题: class myAnim : public QWidget { Q_OBJECT Q_PROPERTY(QColor color READ color WRITE setColor) public: explicit myAnim(QWidget *parent = 0); void setColor (QColor color){

我正在尝试对QPushButton单击事件应用柔和的颜色更改。我使用QPropertyImation的第一种方法非常有效

标题:

class myAnim : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(QColor color READ color WRITE setColor)

public:
    explicit myAnim(QWidget *parent = 0);

    void setColor (QColor color){
        setStyleSheet(QString(" QPushButton { background-color: rgb(%1, %2, %3); }").arg(color.red()).arg(color.green()).arg(color.blue()));
    }
资料来源:

QPropertyAnimation *anim = new QPropertyAnimation(this, "color");
anim->setDuration(300);                      // duration in ms
anim->setStartValue(QColor(0, 0, 0);
anim->setEndValue(QColor(249, 249, 249));
anim->start();
但由于我的按钮有一个线性渐变作为背景,我需要改变不止一种颜色。尝试更改标题,如下所示:

void setColor (QColor color[3]){
        setStyleSheet(QString("QPushButton { background: qlineargradient(x1:0, y1:0, x2:0, y2:1,") +
                      QString("stop: 0    rgba(%1, %2, %3, 255),").arg( color[0].red() ).arg( color[0].green() ).arg( color[0].blue() ) +
                      QString("stop: 0.5  rgba(%1, %2, %3, 255),").arg( color[1].red() ).arg( color[1].green() ).arg( color[1].blue() ) +
                      QString("stop: 0.6  rgba(%1, %2, %3, 255),").arg( color[2].red() ).arg( color[2].green() ).arg( color[2].blue() ) +
                      QString("stop: 1    rgba(%1, %2, %3, 255),").arg( color[0].red() ).arg( color[0].green() ).arg( color[0].blue() ));
    }
我的问题:如何正确编辑源文件中的“setStartValue”和“setEndValue”

编辑1: 我的应用程序中的按钮如下所示:

QPushButton的样式表:

background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #f9f9f9 , stop: 0.5 #B5B5B5 , stop: 0.6 #D6D6D6 , stop:1 #f9f9f9 );
按下事件的样式表:

background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #005da8, stop: 0.5 #2882cc, stop: 0.6 #418ecd, stop:1 #005da8);
单击后,银色渐变变为蓝色渐变。释放后,它们将再次柔和地淡入银色的外观。 如前所述,第一种方法确实可以做到这一点,但只有一种平面颜色。 我以前从未与QPainter或定制paintEvent合作过,因此非常感谢您的帮助

谢谢


Micha

最简单的方法是为每个站点定义一个属性:

Q_PROPERTY(QColor color1 READ color1 WRITE setColor1)
Q_PROPERTY(QColor color2 READ color2 WRITE setColor2)
Q_PROPERTY(QColor color3 READ color3 WRITE setColor3)
Q_PROPERTY(QColor color4 READ color4 WRITE setColor4)
不过它很难看

在您的评论中,您提到每种颜色的RGB成分是相同的,基本上是249、181、214和249。如果您知道每种颜色都基于249,您可以这样做:

void setColor (QColor color){
    const int base = color.red();
    const int stop2 = (181.0 / 249.0) * base;
    const int stop3 = (214.0 / 249.0) * base;
    setStyleSheet(QString("QPushButton { background: qlineargradient(x1:0, y1:0, x2:0, y2:1,") +
                  QString("stop: 0    rgba(%1, %2, %3, 255),").arg( base ).arg( base ).arg( base ) +
                  QString("stop: 0.5  rgba(%1, %2, %3, 255),").arg( stop2 ).arg( stop2 ).arg( stop2 ) +
                  QString("stop: 0.6  rgba(%1, %2, %3, 255),").arg( stop3 ).arg( stop3 ).arg( stop3 ) +
                  QString("stop: 1    rgba(%1, %2, %3, 255),").arg( base ).arg( base ).arg( base ));
}
这允许您为
颜色
属性使用任何颜色(只要所有组件都相同),其他颜色将自动缩放


正如@SaZ所提到的,以这种方式修改样式表可能会很慢。你可以考虑使用,或者(可能是最快的选择),超越和油漆小部件自己。< / P>什么颜色的例子,你会设置?它们都是唯一的,还是从一种颜色生成的?我需要使用如下颜色:
QColor color[3];颜色[0]。setHsv(249249249);颜色[1]。setHsv(181181181181181);颜色[2]。setHsv(214214214214)最后一种颜色与第一种颜色相同,因此顺序需要为:颜色[0]、颜色[1]、颜色[2]、颜色[0]。通过修改QS来制作动画不是一个好主意。因为它非常慢。不过,把一种颜色褪成另一种颜色效果非常好。但是,如果您有其他想法,请随时与我们分享!总是在寻找更好的解决方案。谢谢你的努力,米奇!!但是,由于我对Qpalete或自定义paintEvents都不熟悉,您能给我举个例子吗?这里有一个覆盖了paintEvent()的自定义QWidget:对不起,无法将其转移到我的问题上…:(设置样式表的动画完全是过火了。我绝不会那样做。@MichaW。那么你需要改进你的问题,使之更具体。