Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do stylesheets not work when subclassing QWidget and using Q_OBJECT?

Tags:

qt

Case 1: Create subclass of QWidget with Q_OBJECT and set stylesheet -- no effect.

Case 2: Create subclass of QWidget without Q_OBJECT and set stylesheet -- works as expected

Case 3: Create subclass of QLabel with Q_OBJECT and set stylesheet -- works as expected

How to understand this behavior? Is it possible to make stylesheets work in the case 1?

like image 637
user7797 Avatar asked Aug 20 '13 20:08

user7797


2 Answers

If you want custom QWidget subclasses to support stylesheets, you need to provide the following code: Qt Code:

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

Courtesy of wysota, as well as Qt help.

When you don't provide Q_OBJECT, your class has no Meta data, and hence is considered as a QWidget.

like image 160
Werner Erasmus Avatar answered Oct 24 '22 01:10

Werner Erasmus


I don't know why they don't work, but I translated to python the code in Werner Erasmus's answer. The following "works for me"™

def paintEvent(self, pe):

    o = QStyleOption()
    o.initFrom(self)
    p = QPainter(self)
    self.style().drawPrimitive(QStyle.PE_Widget, o, p, self)
like image 6
White_Rabbit Avatar answered Oct 24 '22 00:10

White_Rabbit