【问题标题】:Why does my inherited widget not behave like superclass [duplicate]为什么我继承的小部件的行为不像超类[重复]
【发布时间】:2019-04-18 22:22:00
【问题描述】:

观察以下代码

#!/usr/bin/env python3
from PyQt5 import QtWidgets as w


class MyWidget(w.QWidget): pass


app = w.QApplication([])
frame = w.QWidget()
grid = w.QGridLayout()
frame.setLayout(grid)

w1 = MyWidget()
w2 = w.QWidget()

grid.addWidget(w1)
grid.addWidget(w2)

w1.setStyleSheet("background-color: red")
w2.setStyleSheet("background-color: red")

frame.show()
app.exec_()

生成的应用不会生成两个相同的红色小部件。 Qt 文档暗示样式表之类的东西应该与子类小部件完美配合。这里有什么问题?

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    正如他们在this postthis post 中评论的那样,您必须重写paintEvent() 的继承类:

    #!/usr/bin/env python3
    from PyQt5 import QtGui, QtWidgets
    
    
    class MyWidget(QtWidgets.QWidget):
        def paintEvent(self, event):
            opt = QtWidgets.QStyleOption()
            opt.initFrom(self)
            p = QtGui.QPainter(self)
            self.style().drawPrimitive(QtWidgets.QStyle.PE_Widget, opt, p, self)
    
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        frame = QtWidgets.QWidget()
        grid = QtWidgets.QGridLayout(frame)
    
        for w in (MyWidget(), QtWidgets.QWidget()):
            grid.addWidget(w)
            w.setStyleSheet("background-color: red")
    
        frame.resize(640, 480)
        frame.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2015-09-02
      • 1970-01-01
      • 2015-04-28
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多