为啥我继承的小部件的行为不像超类[重复]
Posted
技术标签:
【中文标题】为啥我继承的小部件的行为不像超类[重复]【英文标题】: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 文档暗示样式表之类的东西应该与子类小部件完美配合。这里有什么问题?
【问题讨论】:
【参考方案1】:正如他们在this post 和this 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_())
【讨论】:
以上是关于为啥我继承的小部件的行为不像超类[重复]的主要内容,如果未能解决你的问题,请参考以下文章