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中央ウィジェット ( red )として、中央ウィジェットQVBoxLayoutの子として。そこの中に:
    • A QTextEdit(フィラーとして)
    • A QWidget() QHBoxLayout。その中で:
      • QLabels

これは次のようになります。

Qt HBoxLayout

QHBoxLayoutは の子であるため、ラベル間のスペースは黒であると予想されますが、その間は「見えず」、中央のウィジェットは「透けBlackBarて見える」ようです。BlackBarどうしてこれなの?

4

2 に答える 2

2

Style Sheet Syntaxには記載されていませんが、スタイルシートに関してはクラス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 に答える