3

考虑以下示例代码:

from PyQt5.QtWidgets import (QApplication, QHBoxLayout, QLabel, QWidget,
                             QMainWindow, QVBoxLayout, QTextEdit)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        cwidget = QWidget(self)
        cwidget.setStyleSheet("QWidget { background-color: red; }")
        self.setCentralWidget(cwidget)
        self.resize(100, 100)

        vbox = QVBoxLayout(cwidget)
        vbox.addWidget(QTextEdit(self))
        vbox.addWidget(BlackBar(self))

class BlackBar(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet("* { background-color: black; color: white; }")
        hbox = QHBoxLayout(self)
        hbox.setSpacing(5)
        hbox.addWidget(QLabel(text="eggs"))
        hbox.addWidget(QLabel(text="bacon"))

if __name__ == '__main__':
    app = QApplication([])
    main = MainWindow()
    main.show()
    app.exec_()

它有:

  • A QMainWindowQWidget作为中央小部件(红色),作为中央小部件QVBoxLayout的子级。里面:
    • A QTextEdit(仅作为填充物)
    • A QWidget黑色),其中包含一个QHBoxLayout. 里面:
      • QLabels

这看起来像这样:

Qt HBoxLayout

我希望标签之间的空格是黑色的,因为它QHBoxLayout是 的孩子BlackBar,但它似乎BlackBar只是介于两者之间的“不可见”,并且中央小部件“闪耀”。为什么是这样?

4

2 回答 2

3

错误报告现在已经得到了一个比@ekhumoro的答案更简单且有效的解决方案:

我不认为这是有效的。您正在寻找的油漆代码未绘制在paintEvent. QWidgetPrivate::paintBackground而是寻找。出于性能原因,默认情况下小部件将忽略样式表,但您可以WA_StyledBackground在小部件上设置属性,它应该尊重样式表背景。

事实上,在设置样式表之前这样做可以解决问题:

self.setAttribute(Qt.WA_StyledBackground)
于 2014-02-18T16:03:36.327 回答
2

尽管样式表语法没有提到它,但在样式表方面似乎对QWidget类的处理方式有所不同。

其他小部件将与您的示例代码一起正常工作。例如,如果QWidget到处都用 替换QFrame,那么一切都按预期工作。

要获得对子类的样式表支持QWidget,您需要重新实现paintEvent并显式启用它:

class BlackBar(QWidget):
...
    def paintEvent(self, event):
        option = QStyleOption()
        option.initFrom(self)
        painter = QPainter(self)
        self.style().drawPrimitive(
            QStyle.PE_Widget, option, painter, self)
于 2014-02-12T02:29:03.033 回答