【问题标题】:Custom widget background color in pyside2pyside2中的自定义小部件背景颜色
【发布时间】:2020-06-07 01:21:55
【问题描述】:

试图弄清楚如何在 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()

如果我将类创建为最顶层的窗口,则此方法有效。但是,如果我使它成为另一个控件的子控件,则背景颜色将恢复为默认值。其他一些颜色角色确实生效,但不是背景颜色。不仅如此,颜色还会传递给子控件。

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

【问题讨论】:

    标签: python qt pyside2


    【解决方案1】:

    默认情况下,子小部件采用窗口的颜色,因此您可以观察到这种效果,如果您希望使用自定义背景颜色,则必须启用 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)
            self.setAutoFillBackground(True)

    【讨论】:

      【解决方案2】:

      我最终决定为我的小部件覆盖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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多