前提・実現したいこと
PySide で GUI アプリを作成しており、Qt Style Sheet (QSS) でデザインを指定しています。
QSS でカスタムウィジェットを指定できるようにするためには、paintEvent
をオーバーライドすればいいところまではわかりました。
しかし、QSS でカスタムウィジェットを指定した場合に、そのカスタムウィジェットの中で使用している全てのウィジェットにも適用させる方法がわからず困っています。
そんなことができるのか?代替案など含め何かしらご教授いただければ幸いです。
該当のソースコード
以下のサンプルコードでは、カスタムウィジェットの中で使用している QPushButton
QLabel
にはスタイルが適用されませんが、これらにもスタイルを適用させたいです。
py
1import sys 2from PySide6.QtWidgets import * 3from PySide6.QtCore import Qt 4from PySide6.QtGui import QPainter 5 6class CustomWidget(QWidget): 7 """適当にボタンとラベルと横に並べただけのカスタムウィジェット""" 8 9 def __init__(self): 10 super().__init__() 11 12 layout = QHBoxLayout() 13 button = QPushButton('button') 14 layout.addWidget(button, alignment=Qt.AlignCenter) 15 label = QLabel('label') 16 layout.addWidget(label, alignment=Qt.AlignCenter) 17 self.setLayout(layout) 18 19 def paintEvent(self, event): 20 opt = QStyleOption() 21 opt.initFrom(self) 22 painter = QPainter(self) 23 style = self.style() 24 style.drawPrimitive(QStyle.PE_Widget, opt, painter, self) 25 26class MainWindows(QMainWindow): 27 def __init__(self): 28 super().__init__() 29 30 container = QWidget() 31 vbox_layout = QVBoxLayout(container) 32 widget = CustomWidget() 33 vbox_layout.addWidget(widget, alignment=Qt.AlignCenter) 34 self.setCentralWidget(container) 35 36if __name__ == "__main__": 37 38 app = QApplication(sys.argv) 39 app.setStyleSheet('CustomWidget { background-color: cyan; }') 40 window = MainWindows() 41 window.show() 42 window.resize(360, 240) 43 sys.exit(app.exec())
試したこと
カスタムウィジェットとその中で使用しているウィジェット全てに setObjectName
で名前を指定し、ウィジェット名ではなくセレクタのみを指定することで一応所望の結果は得られました。
#sample { background-color: cyan; }
が、あまり汎用的ではないので、できればカスタムウィジェット名を指定するだけでその中のウィジェット全てに適用させたいと考えています。
補足情報(FW/ツールのバージョンなど)
Python 3.8.1
PySide 6.2.2.1
よろしくお願いいたします。
あなたの回答
tips
プレビュー