Почему стили не работают при подклассификации QWidget и использовании Q_OBJECT?

Случай 1: Создайте подкласс QWidget с Q_OBJECT и установите таблицу стилей - без эффекта.

Случай 2: Создайте подкласс QWidget без Q_OBJECT и установите таблицу стилей - работает как ожидалось

Случай 3: Создайте подкласс QLabel с Q_OBJECT и установите таблицу стилей - работает как ожидалось

Как понять это поведение? Возможно ли создание таблиц стилей в случае 1?

Ответ 1

Если вы хотите, чтобы пользовательские подклассы QWidget поддерживали таблицы стилей, вам необходимо предоставить следующий код: Код Qt:

void myclass::paintEvent(QPaintEvent *pe)
{                                                                                                                                        
  QStyleOption o;                                                                                                                                                                  
  o.initFrom(this);                                                                                                                                                                
  QPainter p(this);                                                                                                                                                                
  style()->drawPrimitive(
    QStyle::PE_Widget, &o, &p, this);                                                                                                                         
};

Предоставлено wysota, а также помощь Qt.

Если вы не предоставляете Q_OBJECT, ваш класс не имеет метаданных и, следовательно, рассматривается как QWidget.

Ответ 2

Я не знаю, почему они не работают, но я перевел на python код в ответ Вернера Эразмуса. Следующие "работает для меня" ™

def paintEvent(self, pe):

    o = QStyleOption()
    o.initFrom(self)
    p = QPainter(self)
    self.style().drawPrimitive(QStyle.PE_Widget, o, p, self)