Но как это применить к QPushButton? Ведь текст там рисуется не просто так, а через QStyle::CE_PushButtonLabel. Нельзя потерять смещение текста кнопки вниз при нажатии. Поэтому примитивные трюки вроде размещения метки прямо на кнопке, или простого рисования в paintEvent, как предложено в теме
HTML на QPushButton, здесь не проходят.
В QPushButton функция paintEvent выглядит так:
void QPushButton::paintEvent(QPaintEvent *)
{
QStylePainter p(this);
QStyleOptionButton option;
initStyleOption(&option);
p.drawControl(QStyle::CE_PushButton, option);
}
При этом документация утверждает, что QStyle::CE_PushButton означает последовательную отрисовку CE_PushButtonBevel, CE_PushButtonLabel и PE_FrameFocusRect.
Нельзя ли самостоятельно отрисовать дефолтно CE_PushButtonBevel и PE_FrameFocusRect, а CE_PushButtonLabel - дважды, меняя свойства QPainter?
Попробую такую идею: стилями задать текст кнопок белым; в paintEvent после стандартного кода вставить вывод чёрного текста на прозрачный QPixmap, и этот pixmap наложить при помощи QStylePainter::drawItemPixmap на уже нарисованный белый текст с нужным смещением; вертикальное смещение корректировать по свойству isDown, чтобы попадать в нажатие. Тут главная проблема - определить прямоугольник, в который выводится дефолтный текст.