为什么QWidget在继承时表现不同

Why QWidget behaves differently when it is inherited

当我使用继承的 QWidget 时,边距和间距没有背景颜色,这与直接使用 QWidget 不同(代码基本相同).

纯 QWidget:

class App(QWidget):

    def __init__(self):
        super().__init__()        
        self.start()       

    def start(self):
        self.layout = QHBoxLayout()

        self.layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.layout)   

        self.setGeometry(10, 10, 500, 100) 

        grid_layout = QGridLayout()
        grid_layout.setSpacing(10)

        widget = QWidget()
        widget.setLayout(grid_layout)        
        widget.setStyleSheet('background: green')

        grid_layout.addWidget(QLabel("first"), 0, 0)
        grid_layout.addWidget(QLabel("second"), 0, 1)
        grid_layout.addWidget(QLabel("third"), 0, 2)        

        self.layout.addWidget(widget)
        self.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    #ex.start_card_holder()
    sys.exit(app.exec_())

继承的QWidget:

class App(QWidget):

    ....

    class MainWidget(QWidget):
        def __init__(self):
            QWidget.__init__(self)            

    def start(self):
        ...

        widget = App.MainWidget()
        ...

谁能告诉我哪里做错了?

必须清楚以下概念才能理解行为:

  • 继承自QWidget的类默认不实现基于Qt QStyleSheet的绘画如下问题:

    • Qt Stylesheet for custom widget
    • CSS Stylesheet is not applied to custom QWidget
  • 通过设置 "background: green" 表示小部件在启用时采用该颜色及其子项。

在你的情况下 "widget" 如果它是 QWidget 那么它将被涂漆但如果它是 MainWidget 则不会。

要检查我指出的内容,只需使用上述问题的答案之一启用背景颜色:

# ...
widget = App.MainWidget()
widget.setAttribute(Qt.WA_StyledBackground, True)
# ...