プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/02/10

[PySide] カスタムウィジェットに QSS を適用する

event_note2022/02/09 23:21

QWidget を継承して作成したカスタムウィジェットに Qt Style Sheet を適用するには、paintEvent をオーバーロードする必要があるようです。

環境

  • PySide 6.2.2.1

サンプルコード

CustomWidget {
    background-color: cyan;
}
import sys
from PySide6.QtWidgets import QWidget, QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QStyleOption, QStyle
from PySide6.QtCore import Qt
from PySide6.QtGui import QPainter

class CustomWidget(QWidget):
    """適当にボタンとラベルと横に並べただけのカスタムウィジェット"""

    def __init__(self):
        super().__init__()

        layout = QHBoxLayout()

        button = QPushButton('button')
        layout.addWidget(button, alignment=Qt.AlignCenter)

        label = QLabel('label')
        layout.addWidget(label, alignment=Qt.AlignCenter)

        self.setLayout(layout)
    
    def paintEvent(self, event):
        opt = QStyleOption()
        opt.initFrom(self)
        painter = QPainter(self)
        style = self.style()
        style.drawPrimitive(QStyle.PE_Widget, opt, painter, self)


class MainWindows(QMainWindow):
    def __init__(self):
        super().__init__()

        container = QWidget()
        vbox_layout = QVBoxLayout(container)

        widget = CustomWidget()
        vbox_layout.addWidget(widget, alignment=Qt.AlignCenter)

        self.setCentralWidget(container)

if __name__ == "__main__":

    try:
        with open('style.qss', 'r') as f:
            style = f.read()
    except:
        style = ''

    app = QApplication(sys.argv)
    app.setStyleSheet(style)
    window = MainWindows()
    window.show()
    window.resize(360, 240)
    sys.exit(app.exec())

カスタムウィジェット内全体に適用

上記のサンプルでは背景色を適用していますが、ボタンとラベルには適用されていません。
これの対応方法は調査中です。