PySide2中如何自定义小部件(widget)的背景颜色?

4

尝试找出如何在QWidget中设置背景颜色。以下是我的代码:

class ParentTester(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        left = ColorTester(self)
        right = QFrame(self)
        right.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        layout = QHBoxLayout()
        layout.addWidget(left)
        layout.addWidget(right)
        self.setLayout(layout)


class ColorTester(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(128, 0, 0))
        self.setPalette(palette)

def main():
    import sys
    from PySide2.QtWidgets import QApplication

    app = QApplication([])

    works = True

    if works:
        win = ColorTester()
    else:
        win = ParentTester()
    win.show()
    win.resize(640, 480)

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

如果我将类作为最顶层窗口创建,这个方法可以正常工作。但是,如果我将其作为另一个控件的子控件,背景颜色将回到默认值。其中一些其他的颜色角色确实会生效,但并不包括背景颜色。不仅如此,颜色也会传递给子控件。

如何更改控件的背景颜色而不影响其子控件?

2个回答

4

默认情况下,子组件使用窗口的颜色,所以如果要使用自定义背景颜色,则必须启用autoFillBackground属性:

class ColorTester(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(128, 0, 0))
        self.setPalette(palette)
        <b>self.setAutoFillBackground(True)</b>

enter image description here


0
最终我决定覆盖我的小部件的paintEvent方法。在调色板中设置颜色似乎总是会将颜色传递给子控件,这不是我想要的结果。下面是一个对我有效的示例。这是一个QFrame,它取默认的背景颜色并稍微加深和绿移。
class GreenFrame(QFrame):
    def __init__(self, parent=None):
        super().__init__(parent)
        r, g, b, a = self.palette().color(QPalette.Window).toTuple()
        self._bgcolor = QColor(r * 7 // 8, g, b * 7 // 8)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.fillRect(event.rect(), self._bgcolor)
        super().paintEvent(event)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接