PyQt - Использование QGraphicsDropShadowEffect с несколькими виджетами - PullRequest
0 голосов
/ 28 августа 2018

Я хочу установить тень на несколько виджетов, используя 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_()

1 Ответ

0 голосов
/ 29 августа 2018

В документах указано, что один и тот же эффект 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...