Причина
Сначала вы создаете художник, передавая QPaintDevice *device
конструктору QPainter
, который вызывает QPainter::begin
:
QPainter painter(this);
Затем вы вызываете реализацию базового класса paintEvent
:
QPushButton::paintEvent(e);
, которая создает нового художника QStylePainter p
на в том же устройстве рисования, прежде чем высделано с первым:
void QPushButton::paintEvent(QPaintEvent *)
{
QStylePainter p(this);
QStyleOptionButton option;
initStyleOption(&option);
p.drawControl(QStyle::CE_PushButton, option);
}
Наконец, вы пытаетесь рисовать с первым художником QPainter painter
, используя:
painter.fillRect(rectangle, radialGradient);
Важно: Такой подходнедопустимо, поскольку в документации QPainter::begin
четко сказано:
Предупреждение. Устройство для окраски может быть окрашено только одним художником за один раз.
Решение
Имея это в виду, я бы посоветовал вам избежать двух активных художников одновременно, переместив QPushButton::paintEvent(e);
в самое начало CRoundAnimatingBtn::paintEvent
(до всего остального в этом обработчике событий).
Примечание: Если вы поставите QPushButton::paintEvent(e);
в самом конце CRoundAnimatingBtn::paintEvent
, реализация по умолчанию заменит вашупользовательский чертеж, и он не будет виден.
Пример
Вот как может выглядеть CRoundAnimatingBtn::paintEvent
:
void paintEvent(QPaintEvent * e) {
QPushButton::paintEvent(e);
QPainter painter(this);
QPointF center(width()/2, height()/2);
QRadialGradient radialGradient(center, qMin(width(), height())/2, center);
...
painter.fillRect(rect(), radialGradient);
}
Пример дает следующий результат:
Как видите, текст отображается вместе с вашим пользовательским рисунком.