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

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

    Класс QGraphicsOpacityEffect реализует эффект прозрачности. Иерархия наследования:

  QObject - QGraphicsEffect - QGraphicsOpacityEffect

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

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

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

    Класс QGraphicsOpacityEffect поддерживает следующие сигналы:

    В качестве примера изменим программу, приведенную на 231 шаге, заменив имеющиеся два эффекта (тень и размытие) на прозрачность и изменение цвета. Смена новых эффектов происходит также по нажатию клавиши. Текст приложения приведен ниже, результат работы приложения - на рисунке 1.

from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, 
    QGraphicsItem, QGraphicsPixmapItem, QGraphicsTextItem, QGraphicsEffect, 
    QGraphicsOpacityEffect, QGraphicsColorizeEffect
from PyQt5.QtGui import QPixmap, QPainter, QColor
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:
            # Задание изменения цвета
            clr = QGraphicsColorizeEffect()
            clr.setColor(QColor(140, 50, 255))
            # Добавление эффекта к объекту
            self.image.setGraphicsEffect(clr)
        else:
            # Прозрачность и его параметры
            op = QGraphicsOpacityEffect()
            op.setOpacity(0.3)
            # Добавление эффекта к объекту
            self.image.setGraphicsEffect(op)
        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)
        # Добавление объекта QGraphicsPixmapItem на сцену
        self.scene.addItem(self.image)


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

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


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

    На следующем шаге мы начнем рассматривать обработку событий.




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