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())
カスタムウィジェット内全体に適用
上記のサンプルでは背景色を適用していますが、ボタンとラベルには適用されていません。
これの対応方法は調査中です。