首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置自定义QWidget的背景颜色

设置自定义QWidget的背景颜色
EN

Stack Overflow用户
提问于 2019-09-03 20:37:38
回答 2查看 5.4K关注 0票数 6

我正在尝试创建一个自定义QWidget (来自PyQt5),它的背景颜色可以改变。但是,所有设置背景颜色的标准方法似乎都不适用于自定义的QWidget类。

到目前为止,我已经尝试通过QSS样式表和设置调色板来改变颜色。这适用于常规的QWidget,但由于某些原因而不是自定义小部件。

我在QWidgets文档中找到了需要paintEvent()函数的引用自定义QWidget,在C++中找到了一个对它的引用。但是,由于QStyleOption似乎不存在于PyQt5中,所以实现链接痛苦剂失败了。

下面显示了我创建的高级别QWidget类(它还包含一堆标签)和用于Widget的QSS (样式已在父小部件中设置,但已尝试直接设置)

代码语言:javascript
运行
复制
class AlarmWidget(QWidget):
    def __init__(self, alarm, parent=None):
        super(AlarmWidget, self).__init__(parent)
        self.setFixedHeight(200)
        self.setProperty("active", True)

        self.setAutoFillBackground(True)
        p = self.palette()
        p.setColor(self.backgroundRole(), PyQt5.QtCore.Qt.red)
        self.setPalette(p)
代码语言:javascript
运行
复制
AlarmWidget {
  background-color: red
}

总的来说,无论我做什么,它都不允许我为自定义QWidget设置背景颜色,所以非常感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-04 10:17:13

最简单的解决办法是:

代码语言:javascript
运行
复制
class AlarmWidget(QWidget):
    def __init__(self, alarm, parent=None):
    ...
    self.setAttribute(QtCore.Qt.WA_StyledBackground, True)
    self.setStyleSheet('background-color: red')

每当样式表应用于自定义小部件或其祖先部件之一时,就会发生此问题。引用QWidget.setPalette文档:

警告:不要将此函数与Qt样式表一起使用。当使用样式表时,小部件的调色板可以使用“颜色”、“背景色”、“选择颜色”、“选择背景色”和“备用背景色”进行定制。

但是,这没有提到的是,出于性能原因,自定义小部件默认禁用样式表支持。因此,要使示例正常工作,必须(1)通过样式表设置背景颜色,(2)使用StyledBackground小部件属性显式启用样式表支持。

下面是一个演示这一点的最小示例:

代码语言:javascript
运行
复制
import sys
from PyQt5 import QtCore, QtWidgets

class AlarmWidget(QtWidgets.QWidget):
    def __init__(self, alarm, parent=None):
        super(AlarmWidget, self).__init__(parent)
        self.setFixedHeight(200)
#         self.setAutoFillBackground(True)
#         p = self.palette()
#         p.setColor(self.backgroundRole(), QtCore.Qt.red)
#         self.setPalette(p)
        self.setAttribute(QtCore.Qt.WA_StyledBackground, True)
        self.setStyleSheet('background-color: red')

class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.setStyleSheet('background-color: green')
        self.widget = AlarmWidget('')
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.widget)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setWindowTitle('BG Colour Test')
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

这应该显示一个窗口,其中包含一个带绿色边框的红色矩形,如下所示:

要进一步测试,只需在AlarmWidget类中设置调色板,而不要在Window类中设置样式表。这应该显示一个没有绿色边框的红色矩形。最后,在两个类中只设置样式表,但不要设置setAttribute行。这应该显示一个没有内部红色矩形的普通绿色矩形(即不再应用自定义小部件上的样式表)。

票数 7
EN

Stack Overflow用户

发布于 2019-09-03 20:51:25

所有方法都适用于我,但是如果您想实现paintEvent,那么将其转换为PyQt5是:

代码语言:javascript
运行
复制
class AlarmWidget(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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57778434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档