PyQt5:样式表和继承自 QWidget
PyQt5: stylesheet and inheritance from QWidget
我的代码生成了一个包含两个 QWidget 的 Window,一个红色 (wg1
) 和一个蓝色 (wg2
)。如果它们变成继承自QWidget的Fields(注释掉),它们的颜色就会消失。
我的问题是:为什么 Field
(从 QWidget
继承而来)必须有行
self.setAttribute(Qt.WA_StyledBackground, True)
在其 __init__
方法中 QWidget 不需要这一行?
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_())
解释位于样式表参考的 section related to QWidget 中:
If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
默认情况下,QWidget 默认会这样做,但 QWidget 子类 不会,因此您要么设置标志,要么实现 paintEvent。
在任何情况下,请考虑使用 stylesheet selectors 并避免使用 generic/universal 语法,因为它们通常会导致复杂的子窗口小部件出现意外行为。
我的代码生成了一个包含两个 QWidget 的 Window,一个红色 (wg1
) 和一个蓝色 (wg2
)。如果它们变成继承自QWidget的Fields(注释掉),它们的颜色就会消失。
我的问题是:为什么 Field
(从 QWidget
继承而来)必须有行
self.setAttribute(Qt.WA_StyledBackground, True)
在其 __init__
方法中 QWidget 不需要这一行?
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_())
解释位于样式表参考的 section related to QWidget 中:
If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:
默认情况下,QWidget 默认会这样做,但 QWidget 子类 不会,因此您要么设置标志,要么实现 paintEvent。
在任何情况下,请考虑使用 stylesheet selectors 并避免使用 generic/universal 语法,因为它们通常会导致复杂的子窗口小部件出现意外行为。