(Py)Qt:QHBoxLayout 中的间距显示 centralwidget 的背景,而不是父窗口的

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_()

它有:
- QMainWindow,QWidget作为中央小部件(红色),QVBoxLayout作为中央小部件的子级。里面有: - QTextEdit(只是作为填充) - QWidget(黑色),其中包含QHBoxLayout。在那里: - 两个QLabel
它看起来像这样:
[图片]
我希望标签之间的空格是黑色的,因为QHBoxLayout是BlackBar的子级,但似乎BlackBar在其中只是“不可见”,而中央小部件“透过来了”。为什么会这样?
2个回答

3
这个错误报告现在已经得到回复,提供的解决方案比@ekhumoro 提供的更简单且有效:

我不认为这是有效的。你要查找的绘图代码并没有在paintEvent中被绘制出来。相反,请查找 QWidgetPrivate::paintBackground。出于性能的考虑,小部件默认会忽略样式表,但是您可以在小部件上设置WA_StyledBackground属性,它应该会尊重样式表背景。

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

self.setAttribute(Qt.WA_StyledBackground)

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)

有趣的是 - 我刚刚查看了Qt源代码,QWidget根本没有实现paintEvent。我是否遗漏了什么,或者应该提交一个Qt错误报告,以便更改此问题或澄清文档? - The Compiler
@TheCompiler。这似乎很奇怪,我必须承认我没有一个明确的答案。我的理解是,这只影响QWidget的子类,但我不记得我从哪里得到这个信息了。 - ekhumoro
我现在把这个问题提交到了 QTBUG-36884。让我们看看他们会说什么。 - The Compiler
这个错误现在已经得到了一个更简单的解决方案。我现在回答了自己的问题。无论如何,还是谢谢! - The Compiler

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