Класс QGraphicsEffect
Класс QGraphicsEffect является базовым классом для всех графических эффектов. Подробнее...
| Заголовок: | #include <QGraphicsEffect> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследует: | QObject |
| Наследуется от: | QGraphicsBlurEffect, QGraphicsColorizeEffect, QGraphicsDropShadowEffect и QGraphicsOpacityEffect |
Типы public
| перечисление | ChangeFlag { SourceAttached, SourceDetached, SourceBoundingRectChanged, SourceInvalidated } |
| флаги | ChangeFlags |
| перечисление | PixmapPadMode { NoPad, PadToTransparentBorder, PadToEffectiveBoundingRect } |
Свойства
- enabled : bool
Функции public
| QGraphicsEffect(QObject *parent = nullptr) | |
| virtual | ~QGraphicsEffect() |
| QRectF | boundingRect() const |
| virtual QRectF | boundingRectFor(const QRectF &rect) const |
| bool | isEnabled() const |
Свойства public
| void | setEnabled(bool enable) |
| void | update() |
Сигналы
| void | enabledChanged(bool enabled) |
Защищенные функции
| virtual void | draw(QPainter *painter) = 0 |
| void | drawSource(QPainter *painter) |
| QRectF | sourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const |
| virtual void | sourceChanged(QGraphicsEffect::ChangeFlags flags) |
| bool | sourceIsPixmap() const |
| QPixmap | sourcePixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, QPoint *offset = nullptr, QGraphicsEffect::PixmapPadMode mode = PadToEffectiveBoundingRect) const |
| void | updateBoundingRect() |
Подробное описание
Эффекты изменяют внешний вид элементов, подключаясь к конвейеру отрисовки и работая между источником (например, QGraphicsPixmapItem) и целевым устройством (например, viewport QGraphicsView). Эффекты можно отключить, вызвав setEnabled(false). Если эффекты отключены, источник отрисовывается напрямую.
Для добавления визуального эффекта к QGraphicsItem, например, можно использовать один из стандартных эффектов или, альтернативно, создать свой эффект, создав подкласс QGraphicsEffect. Затем эффект можно установить на элемент с помощью QGraphicsItem::setGraphicsEffect().
Qt предоставляет следующие стандартные эффекты:
- QGraphicsBlurEffect - размывает элемент на заданный радиус
- QGraphicsDropShadowEffect - отрисовывает тень позади элемента
- QGraphicsColorizeEffect - отрисовывает элемент в оттенках любого заданного цвета
- QGraphicsOpacityEffect - отрисовывает элемент с заданной непрозрачностью
Дополнительную информацию о том, как использовать каждый эффект, см. в документации по соответствующему эффекту.
Чтобы создать свой собственный эффект, создайте подкласс QGraphicsEffect (или любого другого существующего эффекта) и переопределите виртуальную функцию draw(). Эта функция вызывается всякий раз, когда эффект необходимо перерисовать. Функция draw() принимает в качестве аргумента объект painter, с помощью которого нужно рисовать. Дополнительную информацию см. в документации для draw(). В функции draw() можно вызвать sourcePixmap() для получения пиксельной карты источника графического эффекта, которую затем можно обработать.
Если ваш эффект меняется, используйте update() для запроса перерисовки. Если ваш пользовательский эффект изменяет область ограничивающей прямоугольник источника, например, радиальный эффект свечения может потребоваться применить дополнительный отступ, вы можете переопределить виртуальную функцию boundingRectFor() и вызвать updateBoundingRect() для уведомления фреймворка всякий раз, когда эта область изменяется. Виртуальная функция sourceChanged() вызывается для уведомления эффектов о том, что источник каким-либо образом изменился, например, если источник является QGraphicsRectItem, и его параметры прямоугольника изменились.
См. такжеQGraphicsItem::setGraphicsEffect() и QWidget::setGraphicsEffect().
Документация по типам членов
перечисление QGraphicsEffect::ChangeFlagфлаги QGraphicsEffect::ChangeFlags
Это перечисление описывает, что изменилось в QGraphicsEffectSource.
| Постоянная | Значение | Описание |
|---|---|---|
QGraphicsEffect::SourceAttached |
0x1 |
Эффект установлен на источник. |
QGraphicsEffect::SourceDetached |
0x2 |
Эффект снят с источника. |
QGraphicsEffect::SourceBoundingRectChanged |
0x4 |
Изменена ограничивающая прямоугольная область источника. |
QGraphicsEffect::SourceInvalidated |
0x8 |
Изменился визуальный вид источника. |
Тип ChangeFlags — это псевдоним для QFlags<ChangeFlag>. Он хранит комбинацию значений ChangeFlag, объединенных операцией ИЛИ.
перечисление QGraphicsEffect::PixmapPadMode
Это перечисление описывает, как должна быть дополнена пиксельная карта, возвращенная из sourcePixmap.
| Постоянная | Значение | Описание |
|---|---|---|
QGraphicsEffect::NoPad |
0 |
Дополнительное заполнение для пиксельной карты не требуется. |
QGraphicsEffect::PadToTransparentBorder |
1 |
Пиксельная карта должна быть дополнена для обеспечения полностью прозрачного края. |
QGraphicsEffect::PadToEffectiveBoundingRect |
2 |
Пиксельная карта должна быть дополнена для соответствия эффективной ограничивающей прямоугольной области эффекта. |
Документация свойств
enabled : bool
Это свойство хранит информацию о том, включен ли эффект или нет.
Если эффект отключён, источник будет отрисовываться обычно, без влияния эффекта. Если эффект включён, источник будет отрисован с применением эффекта.
Это свойство включено по умолчанию.
Используя это свойство, вы можете отключить определённые эффекты на медленных платформах, чтобы обеспечить отзывчивость пользовательского интерфейса.
Функции доступа:
| bool | isEnabled() const |
| void | setEnabled(bool enable) |
Сигнал уведомления:
| void | enabledChanged(bool enabled) |
Документация функций-членов
QGraphicsEffect::QGraphicsEffect(QObject *parent = nullptr)
Создаёт новый экземпляр QGraphicsEffect с указанным parent.
[signal] void QGraphicsEffect::enabledChanged(bool enabled)
Этот сигнал испускается всякий раз, когда эффект включается или выключается. Параметр enabled содержит новое состояние включения эффекта.
Примечание: Сигнал уведомления для свойства enabled.
См. также isEnabled().
[slot] void QGraphicsEffect::update()
Планирует перерисовку эффекта. Вызывайте эту функцию всякий раз, когда эффект необходимо перерисовать. Эта функция не вызывает перерисовку источника.
См. также updateBoundingRect().
[virtual] QGraphicsEffect::~QGraphicsEffect()
Удаляет эффект из источника и уничтожает графический эффект.
QRectF QGraphicsEffect::boundingRect() const
Возвращает эффективную ограничивающую прямоугольник для этого эффекта, т.е. ограничивающую прямоугольник источника в координатах устройства, скорректированную любыми отступами, применёнными самим эффектом.
См. также boundingRectFor() и updateBoundingRect().
[virtual] QRectF QGraphicsEffect::boundingRectFor(const QRectF &rect) const
Возвращает эффективную ограничивающую прямоугольник для этого эффекта, учитывая предоставленный rect в координатах устройства. При написании собственного пользовательского эффекта, вы должны вызвать updateBoundingRect(), когда любые параметры будут изменены, что может привести к тому, что эта функция вернёт другое значение.
См. также sourceBoundingRect().
[pure virtual protected] void QGraphicsEffect::draw(QPainter *painter)
Эта чисто виртуальная функция рисует эффект и вызывается всякий раз, когда источник необходимо отрисовать.
Переопределите эту функцию в подклассе QGraphicsEffect, чтобы реализовать отрисовку эффекта, используя painter.
Например:
MyGraphicsEffect::draw(QPainter *painter)
{
...
QPoint offset;
if (sourceIsPixmap()) {
// No point in drawing in device coordinates (pixmap will be scaled anyways).
const QPixmap pixmap = sourcePixmap(Qt::LogicalCoordinates, &offset);
...
painter->drawPixmap(offset, pixmap);
} else {
// Draw pixmap in device coordinates to avoid pixmap scaling;
const QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset);
painter->setWorldTransform(QTransform());
...
painter->drawPixmap(offset, pixmap);
}
...
} Эта функция не должна вызываться явно пользователем, так как предназначена только для переопределения.
[protected] void QGraphicsEffect::drawSource(QPainter *painter)
Отрисовывает источник напрямую с помощью данного painter.
Эта функция должна вызываться только из QGraphicsEffect::draw().
Например:
MyGraphicsOpacityEffect::draw(QPainter *painter)
{
// Fully opaque; draw directly without going through a pixmap.
if (qFuzzyCompare(m_opacity, 1)) {
drawSource(painter);
return;
}
...
} См. также QGraphicsEffect::draw().
[protected] QRectF QGraphicsEffect::sourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const
Возвращает ограничивающую прямоугольник источника, преобразованную в указанную system.
Вызов этой функции с Qt::DeviceCoordinates вне QGraphicsEffect::draw() даст неопределённые результаты, так как контекст устройства недоступен.
См. также draw().
[virtual protected] void QGraphicsEffect::sourceChanged(QGraphicsEffect::ChangeFlags flags)
Эта виртуальная функция вызывается QGraphicsEffect, чтобы уведомить эффект об изменении источника. Если эффект применяет кэш, то этот кэш должен быть очищен, чтобы отразить новый вид источника.
flags описывает, что изменилось.
[protected] bool QGraphicsEffect::sourceIsPixmap() const
Возвращает true, если источник фактически является пиктограммой, например, QGraphicsPixmapItem.
Эта функция полезна для оптимизации. Например, нет смысла рисовать источник в координатах устройства, чтобы избежать масштабирования пиктограммы, если эта функция возвращает true — пиктограмма источника будет масштабироваться в любом случае.
[protected] QPixmap QGraphicsEffect::sourcePixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, QPoint *offset = nullptr, QGraphicsEffect::PixmapPadMode mode = PadToEffectiveBoundingRect) const
Возвращает пиктограмму с нарисованным источником.
system указывает систему координат, которая должна использоваться для источника. Необязательный параметр offset возвращает смещение, в котором пиктограмма должна быть нарисована с помощью текущего рисовальщика. Для управления тем, как пиктограмма заполняется, используйте параметр mode.
Возвращаемая пиктограмма обрезается до текущей прямоугольника устройства рисовальщика, когда system является Qt::DeviceCoordinates.
Вызов этой функции с Qt::DeviceCoordinates вне QGraphicsEffect::draw() даст неопределённые результаты, так как контекст устройства недоступен.
См. также draw() и boundingRect().
[protected] void QGraphicsEffect::updateBoundingRect()
Эта функция уведомляет фреймворк эффектов, когда ограничивающая прямоугольник эффекта изменилась. Как разработчик пользовательского эффекта, вы должны вызвать эту функцию всякий раз, когда вы изменяете какие-либо параметры, которые могут привести к тому, что виртуальная функция boundingRectFor() вернёт другое значение.
Эта функция вызовет update(), если это необходимо.
См. также boundingRectFor(), boundingRect() и sourceBoundingRect().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qgraphicseffect.html