【问题标题】:Using QGraphicsDropShadowEffect with multiple widgets将 QGraphicsDropShadowEffect 与多个小部件一起使用
【发布时间】:2018-08-28 20:51:32
【问题描述】:

我想使用 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_()

【问题讨论】:

    标签: python pyqt pyqt5 qgraphicseffect


    【解决方案1】:

    docs 声明相同的 QGraphicsEffect 不能被其他小部件共享:

    如果 effect 是安装在不同小部件上的效果,setGraphicsEffect() 将从小部件中移除效果并将其安装在此小部件上。

    因此,您必须为每个小部件创建一个QGraphicsEffect,但如果您不想编写大量代码并希望应用具有相似特征的效果,您可以遍历小部件,为此您可以使用 @ 987654324@.

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

    【讨论】:

    • 这个例子不起作用,因为你需要给 QGraphicsDropShadowEffect 构造函数一个父级。您需要添加“parent=child”,至少使用 PySide2
    【解决方案2】:

    子继承效果,所以你需要做的就是在父对象上设置它

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

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多