问题描述
我的代码生成一个包含两个 QWidget 的窗口,一个红色 (wg1) 和一个蓝色 (wg2).如果它们变成继承自 QWidget 的 Fields(注释掉),它们的颜色就会消失.
My code generates a Window containing two QWidgets, a red (wg1) and a blue (wg2) one. If they become Fields (commented out) which inherits from QWidget, their color disappears.
我的问题是:为什么 Field(继承自 QWidget)需要有一行
My question is: Why is it necessary for a Field (which inherits from QWidget), to have the line
self.setAttribute(Qt.WA_StyledBackground, True)
在它的 __init__ 方法中,而 QWidget 不需要这一行?
in its __init__-method while a QWidget doesn't need this line?
import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout from PyQt5.QtCore import Qt class Field(QWidget): def __init__(self, name): super().__init__() self.name = name # self.setAttribute(Qt.WA_StyledBackground, True)# !!! def mousePressEvent(self, event): print(f" click makes {self.name} green") self.setStyleSheet("background: #00ff00;") if __name__ == "__main__": app = QApplication(sys.argv) root = QWidget() grid = QGridLayout() root.setLayout(grid) root.resize(300,100) wg1 = QWidget() wg2 = QWidget() # wg1 = Field('wg1') # wg2 = Field('wg2') wg1.setStyleSheet("background: #aa1111;") grid.addWidget(wg1, 0, 0) wg2.setStyleSheet("background: #1111aa;") grid.addWidget(wg2, 0, 2) root.show() sys.exit(app.exec_())
推荐答案
解释在样式表参考中与 QWidget 相关的部分:
如果您从 QWidget 继承,您需要为您的自定义 QWidget 提供一个paintEvent,如下所示:
If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
默认情况下,QWidget 会默认执行此操作,但 QWidget 子类不会,因此您要么设置标志,要么实现paintEvent.
By default, QWidget does that by default, but QWidget subclasses do not, so you either set the flag or you implement the paintEvent.
无论如何,请考虑使用 样式表选择器 并避免通用/通用语法,因为它们通常会导致复杂的子小部件出现意外行为.
In any case, consider using stylesheet selectors and avoid generic/universal syntax as they often result in unexpected behavior for complex child widgets.