使用动画更改QWidget的背景颜色

时间:2015-12-23 23:58:18

标签: qt

我想使用动画更改小部件的背景颜色(如qlabel)。事实上,我希望在QMainWindow上运行淡入淡出动画以获得子窗口小部件的背景颜色。所以,我写了一些如下代码:

QPropertyAnimation *animation = new QPropertyAnimation(ui->label1, "styleSheet");

animation->setStartValue("background-color: rgb(240, 240, 240)");
animation->setEndValue("background-color: rgb(126, 194, 66)");
animation->setDuration(3000);

animation->start();

但没有变化!!!
我该怎么办?

谢谢: - )

它解决了: - )

1 个答案:

答案 0 :(得分:8)

经过一些调查后,似乎从QVariantAnimation继承的QPropertyAnimation不支持QString作为动画的属性。所有支持的属性的列表是here(Int,UInt,Double,Float,QLine,QLineF,QPoint,QPointF,QSize,QSizeF,QRect,QRectF,QColor)

因此,您需要为要更改背景颜色的每个窗口小部件创建子类,并为它们创建自己的属性。

喜欢这个 - Q_PROPERTY(QColor color READ color WRITE setColor)

并且在此子类的setColor方法中,您应该更改颜色。

以下QLabel的示例:

class AnimatedLabel : public QLabel
{

  Q_OBJECT
  Q_PROPERTY(QColor color READ color WRITE setColor)

public:
  AnimatedLabel(QWidget *parent = 0)
  {
  }
  void setColor (QColor color){
    setStyleSheet(QString("background-color: rgb(%1, %2, %3);").arg(color.red()).arg(color.green()).arg(color.blue()));
  }
  QColor color(){
    return Qt::black; // getter is not really needed for now
  }
};

您的动画调用应更改为:

QPropertyAnimation *animation = new QPropertyAnimation(ui->label, "color");
animation->setDuration(2000);
animation->setStartValue(QColor(0, 0, 0));
animation->setEndValue(QColor(240, 240, 240));
animation->start();

其中ui->标签是AnimatedLabel(在表单设计器中将您的QLabel提升为AnimatedLabel。