PyQt5:样式表和从QWidget继承

2024-07-03 05:53:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码生成一个包含两个QWidget的窗口,一个红色(wg1)和一个蓝色(wg2)窗口。如果它们成为从QWidget继承的字段(注释掉),它们的颜色将消失

我的问题是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_())

Tags: namefromimportselffieldinitsysroot
1条回答
网友
1楼 · 发布于 2024-07-03 05:53:40

解释位于样式表引用的section related to QWidget中:

If you subclass from QWidget, you need to provide a paintEvent for your custom QWidget as below:

默认情况下,QWidget默认会这样做,但QWidget子类不会这样做,因此您可以设置标志或实现paintEvent

在任何情况下,考虑使用^ a2},避免泛型/通用语法,因为它们通常会导致复杂子控件的意外行为。

相关问题 更多 >