Все таки нашел решение через переопределение класса QPushButton. Фишка заключается в том, что внутри можно создать экземпляры QLabel и использовать их вместо родного тайтла кнопки (понадобится создать компоновщик). Также нужно переопределить метод setText() и sizeHint():
class RichTextPushButton(QPushButton):
def __init__(self, parent=None, text=None):
if parent is not None:
super().__init__(parent)
else:
super().__init__()
self.__lbl = QLabel(self)
if text is not None:
self.__lbl.setText(text)
self.__lyt = QHBoxLayout()
self.__lyt.setContentsMargins(0, 0, 0, 0)
self.__lyt.setSpacing(0)
self.setLayout(self.__lyt)
self.__lbl.setAttribute(Qt.WA_TranslucentBackground)
self.__lbl.setAttribute(Qt.WA_TransparentForMouseEvents)
self.__lbl.setSizePolicy(
QSizePolicy.Expanding,
QSizePolicy.Expanding,
)
self.__lbl.setTextFormat(Qt.RichText)
self.__lyt.addWidget(self.__lbl)
return
def setText(self, text):
self.__lbl.setText(text)
self.updateGeometry()
return
def sizeHint(self):
s = QPushButton.sizeHint(self)
w = self.__lbl.sizeHint()
s.setWidth(w.width())
s.setHeight(w.height())
return s
Вместе с тем убираем фон и ивенты связанные с мышью на лэйблах.
PS: Стоит отметить, что тем не менее форматирование в этом случае заметно более ограничено, чем в нативном HTML и CSS. К примеру нельзя прикрутить к span'у border-radius. Он просто на него не реагирует. Но все же это лучше, чем ничего.