Шаг 231.
Библиотека PyQt5.
Графическая сцена. Эффекты. Размытие

    На этом шаге мы рассмотрим класс, используемый для задания размытия, и перечислим его основные методы.

    Класс QGraphicsBlurEffeet реализует эффект размытия. Иерархия наследования:

  QObject - QGraphicsEffect - QGraphicsBlurEffect 

    Формат конструктора класса:

  <Объект> = QGraphicsBlurEffect([parent=None])

    Класс QGraphicsBlurEffect наследует все методы из базовых классов и поддерживает следующие методы (здесь приведены только основные - полный их список доступен на странице https://doc.qt.io/qt-5/qgraphicsblureffect.html):

    Класс QGraphicsBlurEffect поддерживает сигнал blurRadiusChanged(<Paдиус размытия>), который генерируется при изменении радиуса размытия. Внутри обработчика через параметр доступно новое значение в виде вещественного числа.

    В заключение приведем в качестве примера небольшую программу, иллюстрирующую представленные на предыдущем и этом шагах, эффекты. Для этого немного изменим текст программы из 226 шага: уберем вывод текста и к оставшейся картинке добавим два эффекта - тень и размытие. Переключение между ними осуществляется по нажатию любой клавиши.

    Текст программы приведен ниже, а результат ее работы - на рисунке 1. Из комментариев понятен принцип ее работы.

from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, 
  QGraphicsItem, QGraphicsPixmapItem, QGraphicsTextItem, QGraphicsEffect, 
  QGraphicsDropShadowEffect, QGraphicsBlurEffect
from PyQt5.QtGui import QPixmap, QPainter, QFont
from PyQt5.Qt import Qt
 
import sys
 
class Window(QMainWindow):
    def __init__(self):
        super().__init__()
 
        self.title = "Эффекты"
        self.top = 200
        self.left = 500
        self.width = 400
        self.height = 400

        # Флаг для выбора эффекта
        self.flag = True
        
        self.setWindowTitle(self.title)
        # Задание местоположения и размера окна
        self.setGeometry(self.left, self.top, self.width, self.height)
        # Создание графической сцены
        self.scene = QGraphicsScene()
        # Создание инструмента для отрисовки графической сцены
        self.graphicView = QGraphicsView(self.scene, self)
        # Задание местоположения и размера графической сцены
        self.graphicView.setGeometry(0, 0, self.width, self.height)

    def keyPressEvent(self, event):
        # Обработчик нажатия клавиш
        self.flag = not self.flag
        if self.flag == True:
            # Задание эффекта тени
            shadow = QGraphicsDropShadowEffect()
            shadow.setBlurRadius(10)
            shadow.setXOffset(5)
            shadow.setYOffset(5)
            # Добавление эффекта к объекту
            self.image.setGraphicsEffect(shadow)
        else:
            # Размытие и его параметры
            blur = QGraphicsBlurEffect()
            blur.setBlurRadius(3)
            # Добавление эффекта к объекту
            self.image.setGraphicsEffect(blur)
        event.accept() # Завершение обработки события
        
    def plot(self):
        # Создание объекта QPixmap
        self.picture = QPixmap('IMG2.jpg')
        # Создание "пустого" объекта QGraphicsPixmapItem
        self.image = QGraphicsPixmapItem()
        # Задание изображения в объект QGraphicsPixmapItem
        self.image.setPixmap(self.picture)
        # Позиция объекта QGraphicsPixmapItem
        self.image.setOffset(0, 0)
        # Задание эффекта тени
        shadow = QGraphicsDropShadowEffect()
        shadow.setBlurRadius(10)
        shadow.setXOffset(5)
        shadow.setYOffset(5)
        # Добавление эффекта к объекту
        self.image.setGraphicsEffect(shadow)
        # Добавление объекта QGraphicsPixmapItem на сцену
        self.scene.addItem(self.image)


App = QApplication(sys.argv)
window = Window()
window.show() # Демонстрация окна
window.plot() # Построение и перерисовка окна

sys.exit(App.exec())
Архив с файлами можно взять здесь.


Рис.1. Смена эффекта по нажатию клавиши

    В заключение отметим, что в документации указано, что тот же эффект не может быть доступен другим объектам (виджетам):

    "Если эффект - установленный эффект для другого виджета, setGraphicsEffect() удалит эффект из виджета и установит его в этом виджете."

    Таким образом, вам нужно будет создать эффект (объект класса QGraphicsEffect) для каждого виджета (объекта), но если вы не хотите писать много кода и хотите применять эффекты со схожими характеристиками, вы можете перебирать виджеты (объекты), используя для этой цели метод findChildren().

    На следующем шаге мы рассмотрим изменение цвета.




Предыдущий шаг Содержание Следующий шаг