Я пытаюсь применить мягкое изменение цвета к нажатому событию QPushButton. Мой первый подход с QPropertyAnimation работает как шарм.
заголовок:
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:
Кнопки в моем приложении выглядят так:
button_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, поэтому любая помощь будет высоко оценена!
Спасибо!
Миха
Самый простой способ сделать это — определить свойство для каждой остановки:
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 ));
}
Это позволяет использовать любой цвет для color
свойство (при условии, что все компоненты одинаковы), а другие цвета будут масштабироваться автоматически.
Как уже упоминалось @SaZ, изменение таблиц стилей таким способом может быть медленным. Вы могли бы рассмотреть возможность использования QPalette
вместо этого или (возможно, самый быстрый вариант) переопределить paintEvent()
и нарисуй виджет сам.
Других решений пока нет …