4

QGraphicsDropShadowEffect を使用して複数のウィジェットに影を設定したいのですが、以下の例のように、使用したいインスタンスごとに同じコードを何度も何度も書く必要がなく、より良い方法があるかどうか疑問に思っています。setGraphicsEffect()ウィジェットに設定するだけでよいように、呼び出すクラスまたは何かを作成することは可能ですか? そのためにいくつかのクラスを作成しようとしましたが、それでも 1 つのシャドウを作成することしかできませんでした。

import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, \
    QGraphicsDropShadowEffect, QPushButton, QApplication, QComboBox


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        layout = QHBoxLayout()

        self.shadow = QGraphicsDropShadowEffect()
        self.shadow.setBlurRadius(5)
        self.shadow.setXOffset(3)
        self.shadow.setYOffset(3)

        self.shadow2 = QGraphicsDropShadowEffect()
        self.shadow2.setBlurRadius(5)
        self.shadow2.setXOffset(3)
        self.shadow2.setYOffset(3)

        self.btn = QPushButton("Button")
        self.btn.setGraphicsEffect(self.shadow)
        self.combo = QComboBox()
        self.combo.setGraphicsEffect(self.shadow2)

        layout.addWidget(self.btn)
        layout.addWidget(self.combo)
        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()
4

2 に答える 2

10

ドキュメントには、同じ QGraphicsEffect を他のウィジェットで共有できないと記載されています。

effect が別のウィジェットにインストールされたエフェクトである場合setGraphicsEffect()、ウィジェットからエフェクトを削除し、このウィジェットにインストールします。

そのため、ウィジェットごとに を作成する必要がありますがQGraphicsEffect、多くのコードを記述したくなく、同様の特性を持つ効果を適用したい場合は、ウィジェットを反復処理して を使用できますfindChildren(...)

import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, \
    QGraphicsDropShadowEffect, QPushButton, QApplication, QComboBox


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        layout = QHBoxLayout(self)

        self.btn = QPushButton("Button")
        self.combo = QComboBox()

        layout.addWidget(self.btn)
        layout.addWidget(self.combo)

        for child in self.findChildren(QWidget):
            shadow = QGraphicsDropShadowEffect(blurRadius=5, xOffset=3, yOffset=3)
            child.setGraphicsEffect(shadow)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
于 2018-08-28T21:14:13.563 に答える