QGraphicsEffect 类

QGraphicsEffect 类是所有图形效果的基础类。 更多...

头文件 #include <QGraphicsEffect>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承 QObject
继承自

QGraphicsBlurEffectQGraphicsColorizeEffectQGraphicsDropShadowEffectQGraphicsOpacityEffect

公开类型

枚举ChangeFlag { 缓存附加,源分离,边界矩形更改,源无效 }
标志ChangeFlags
枚举PixmapPadMode { 无填充,填充到透明边界,填充到实际边界矩形 }

属性

公开功能

QGraphicsEffect(QObject *parent = nullptr)
虚拟~QGraphicsEffect()
QRectFboundingRect() const
虚拟 QRectFboundingRectFor(const QRectF &rect) const
boolisEnabled() const

公开槽

voidsetEnabled(bool enable)
void更新()

信号

voidenabledChanged(bool enabled)

保护函数

虚拟 voiddraw(QPainter *painter) = 0
voiddrawSource(QPainter *painter)
QRectFsourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const
虚拟 voidsourceChanged(QGraphicsEffect::ChangeFlags flags)
boolsourceIsPixmap() const
QPixmapsourcePixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, QPoint *offset = nullptr, QGraphicsEffect::PixmapPadMode mode = PadToEffectiveBoundingRect) const
voidupdateBoundingRect()

详细说明

效果通过挂钩到渲染管道并在源(例如,一个QGraphicsPixmapItem)和目标设备(例如,QGraphicsView的视口)之间操作来改变元素的外观。可以通过调用setEnabled(false)来禁用效果。如果禁用效果,则直接渲染源。

要将视觉效果添加到QGraphicsItem,例如,可以使用标准效果之一,或者通过创建QGraphicsEffect的子类来创建自己的效果。然后,可以使用QGraphicsItem::setGraphicsEffect()在项目上安装此效果。

Qt提供以下标准效果

有关如何使用每个效果的更多信息,请参阅特定效果的文档。

要创建自己的自定义效果,请创建QGraphicsEffect(或任何其他现有效果)的子类,并重新实现虚拟函数draw()。此函数在效果需要重新绘制时被调用。该draw()函数将用作绘制画家作为参数。有关更多信息,请参阅draw()的文档。在draw()函数中,您可以调用sourcePixmap()以获取图形效果源的位图,然后可以对其进行处理。

如果您的效果发生变化,请使用update()请求重新绘制。如果您的自定义效果更改了源的边界框,例如,径向发光效果可能需要应用额外的边距,您可以重新实现虚拟函数boundingRectFor,并调用updateBoundingRect()来通知框架何时发生此矩形更改。虚拟的sourceChanged()函数用于通知影响源已以某种方式发生变化 - 例如,如果源是QGraphicsRectItem且其矩形参数已更改。

另请参阅QGraphicsItem::setGraphicsEffect()和QWidget::setGraphicsEffect

成员类型文档

枚举QGraphicsEffect::ChangeFlag
flags QGraphicsEffect::ChangeFlags

此枚举描述了QGraphicsEffectSource中发生了什么变化。

常量描述
QGraphicsEffect::SourceAttached0x1效果安装在一个源上。
QGraphicsEffect::SourceDetached0x2效果从源卸载。
QGraphicsEffect::SourceBoundingRectChanged0x4源的边界矩形已更改。
QGraphicsEffect::SourceInvalidated0x8源的视觉外观已更改。

QFlags<ChangeFlag>类型是ChangeFlag的类型别名。它存储ChangeFlag值的组合。

枚举QGraphicsEffect::PixmapPadMode

此枚举描述了从sourcePixmap返回的位图应该如何填充。

常量描述
QGraphicsEffect::NoPad0像素图不应该接收任何额外的填充。
QGraphicsEffect::PadToTransparentBorder1应将像素图填充以确保其具有完全透明的边缘。
QGraphicsEffect::PadToEffectiveBoundingRect2应将像素图填充以匹配效果的生效边界矩形。

属性文档

enabled : bool

该属性表示效果是否启用。

如果效果被禁用,则源将被正常渲染,不受到效果的影响。如果效果被启用,则会应用该效果来渲染源。

该属性默认启用。

使用此属性,您可以在慢速平台禁用某些效果,以确保用户界面响应用户操作。

访问函数

boolisEnabled() const
voidsetEnabled(bool enable)

通知器信号

voidenabledChanged(bool enabled)

成员函数文档

QGraphicsEffect::QGraphicsEffect(QObject *parent = nullptr)

构造一个新的QGraphicsEffect实例,具有指定的parent

[virtual noexcept] 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

[信号] void QGraphicsEffect::enabledChanged(bool enabled)

当效果被启用或禁用时,会发出此信号。参数enabled包含效果的新启用状态。

注意:属性 enabled 的通知信号。

另请参阅:isEnabled()。

[受保护] QRectF QGraphicsEffect::sourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const

返回将源映射到给定system的边界矩形。

当在QGraphicsEffect::draw()之外调用此函数使用Qt::DeviceCoordinates,将给出未定义的结果,因为没有设备上下文可用。

另请参阅:draw()。

[虚受保护] void QGraphicsEffect::sourceChanged(QGraphicsEffect::ChangeFlags flags)

此虚函数由 QGraphicsEffect 调用来通知效果,源已更改。如果效果应用了任何缓存,则必须清除这些缓存,以便反映源的新外观。

flags 描述了哪些内容已更改。

[受保护] bool QGraphicsEffect::sourceIsPixmap() const

如果源实际上是一个位图,例如一个QGraphicsPixmapItem,则返回 true

此函数在优化方面很有用。例如,如果此函数返回 true,则无需在设备坐标中绘制源以避免位图缩放 - 位图无论如何都需要缩放。

[受保护] QPixmap QGraphicsEffect::sourcePixmap(Qt::CoordinateSystem system = Qt::LogicalCoordinates, QPoint *offset = nullptr, QGraphicsEffect::PixmapPadMode mode = PadToEffectiveBoundingRect) const

返回一个绘有源的位图。

system 指定用于源的坐标系统。可选的 offset 参数返回应使用当前绘制器绘制的位图偏移。要控制如何填充位图,请使用 mode 参数。

systemQt::DeviceCoordinates 时,返回位图被裁剪到当前绘制器的设备矩形。

当在QGraphicsEffect::draw()之外调用此函数使用Qt::DeviceCoordinates,将给出未定义的结果,因为没有设备上下文可用。

另请参阅:draw() 和 boundingRect()。

[槽] void QGraphicsEffect::update()

安排重新绘制效果。每当效果需要重新绘制时,请调用此函数。此函数不会触发源的重新绘制。

另请参阅:updateBoundingRect()。

[受保护] void QGraphicsEffect::updateBoundingRect()

此函数在效果的边界矩形发生变化时通知效果框架。作为自定义效果作者,您必须在更改任何将导致虚拟boundingRectFor()函数返回不同值的参数时调用此函数。

如果需要,此函数将调用update()。

另请参阅 boundingRectFor(),boundingRect() 和 sourceBoundingRect()。

© 2024 Qt公司。本文件中的文档贡献是属于各自所有者的版权。所提供的文档是根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款许可的。Qt及相应的商标是Qt公司(芬兰)及其全球子公司和附属公司的商标。所有其他商标均为其各自所有者的财产。