PyQt-将QGraphicsDropShadowEffect与多个小部件一起使用

时间:2018-08-28 20:51:33

标签: python pyqt pyqt5 qgraphicseffect

我想使用QGraphicsDropShadowEffect在多个窗口小部件上设置阴影,我想知道是否有更好的方法,而不必为每个我想在其中使用它的实例重复一遍又一遍地编写相同的代码下面的例子。是否可以创建一个类或要调用的东西,以便我只需要在小部件上设置setGraphicsEffect()?我已经尝试为其创建一些类,但是我仍然只能让他们创建一个阴影。

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_()

2 个答案:

答案 0 :(得分:5)

docs指出相同的QGraphicsEffect无法由其他小部件共享:

  

如果效果是在其他窗口小部件上安装的效果,则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 children in self.findChildren(QWidget):
            shadow = QGraphicsDropShadowEffect(blurRadius=5, xOffset=3, yOffset=3)
            children.setGraphicsEffect(shadow)

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

答案 1 :(得分:0)

孩子继承了效果,所以你需要做的就是把它设置在父母身上

import sys
from PySide2.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)
        self.shadow.setBlurRadius(16)
        self.shadow.setXOffset(8)
        self.shadow.setYOffset(8)

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

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


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