PyQt5:样式表和来自 QWidget 的继承

PyQt5: stylesheet and inheritance from QWidget(PyQt5:样式表和来自 QWidget 的继承)
本文介绍了PyQt5:样式表和来自 QWidget 的继承的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我的代码生成一个包含两个 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.

这篇关于PyQt5:样式表和来自 QWidget 的继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

groupby multiple coords along a single dimension in xarray(在xarray中按单个维度的多个坐标分组)
Group by and Sum in Pandas without losing columns(Pandas中的GROUP BY AND SUM不丢失列)
Group by + New Column + Grab value former row based on conditionals(GROUP BY+新列+基于条件的前一行抓取值)
Groupby and interpolate in Pandas(PANDA中的Groupby算法和插值算法)
Pandas - Group Rows based on a column and replace NaN with non-null values(PANAS-基于列对行进行分组,并将NaN替换为非空值)
Grouping pandas DataFrame by 10 minute intervals(按10分钟间隔对 pandas 数据帧进行分组)