C++ 使用QPropertyImation更改QPushButton的背景色
我正在尝试对QPushButton单击事件应用柔和的颜色更改。我使用QPropertyImation的第一种方法非常有效 标题: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){
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。那么你需要改进你的问题,使之更具体。