На этом шаге мы рассмотрим класс, используемый для задания размытия, и перечислим его основные методы.
Класс 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().
На следующем шаге мы рассмотрим изменение цвета.