Ваш градиент настроен на переход от <0, 0>
до <button_2->width(), 0>
, но в момент создания градиента button_2
не включен ни в один макет: его ширина будет вычислена, когда родительский виджет (следовательно, макет, где кнопка) изменена. Если вы попытаетесь зафиксировать ширину, вы увидите, что градиент работает как положено.
QPushButton* button_2 = new QPushButton();
button_2->setFixedWidth(100);
Вы можете использовать фильтр событий, чтобы следить за изменением размера и корректировать градиент соответственно:
class ButtonResizeWatcher : public QObject {
protected:
virtual bool eventFilter(QObject* o, QEvent* e) override {
if (e->type() == QEvent::Resize) {
auto button = qobject_cast<QPushButton*>(o);
QLinearGradient gradient_button(0, 0, button->width(), 0);
gradient_button.setColorAt(0, Qt::white);
gradient_button.setColorAt(1, Qt::red);
auto palette = button->palette();
palette.setBrush(QPalette::Button, QBrush(gradient_button));
button->setPalette(palette);
}
return QObject::eventFilter(o, e);
}
};
Использование:
ButtonResizeWatcher resize_watcher;
button_2->installEventFilter(&resize_watcher);
Полный код можно найти в GitHub .
Другим вариантом, как отмечено в другом ответе, будет использование таблицы стилей (qlineargradient
). От вас зависит, нужен ли вам дополнительный контроль над кистью, такой как «показывать градиент, но только до достижения определенной ширины». Кроме того, примите во внимание, что таблицы стилей обычно конфликтуют с другими QStyle
(если используются).