QGraphicsEffect 类
QGraphicsEffect 类是所有图形效果的基础类。 更多...
头文件 | #include <QGraphicsEffect> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake | QT += widgets |
继承 | QObject |
继承自 | QGraphicsBlurEffect,QGraphicsColorizeEffect,QGraphicsDropShadowEffect 和 QGraphicsOpacityEffect |
公开类型
枚举 | ChangeFlag { 缓存附加,源分离,边界矩形更改,源无效 } |
标志 | ChangeFlags |
枚举 | PixmapPadMode { 无填充,填充到透明边界,填充到实际边界矩形 } |
属性
- enabled : bool
公开功能
QGraphicsEffect(QObject *parent = nullptr) | |
虚拟 | ~QGraphicsEffect() |
QRectF | boundingRect() const |
虚拟 QRectF | boundingRectFor(const QRectF &rect) const |
bool | isEnabled() const |
公开槽
void | setEnabled(bool enable) |
void | 更新() |
信号
void | enabledChanged(bool enabled) |
保护函数
虚拟 void | draw(QPainter *painter) = 0 |
void | drawSource(QPainter *painter) |
QRectF | sourceBoundingRect(Qt::CoordinateSystem system = Qt::LogicalCoordinates) const |
虚拟 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)和目标设备(例如,QGraphicsView的视口)之间操作来改变元素的外观。可以通过调用setEnabled(false)来禁用效果。如果禁用效果,则直接渲染源。
要将视觉效果添加到QGraphicsItem,例如,可以使用标准效果之一,或者通过创建QGraphicsEffect的子类来创建自己的效果。然后,可以使用QGraphicsItem::setGraphicsEffect()在项目上安装此效果。
Qt提供以下标准效果
- QGraphicsBlurEffect - 以指定的半径模糊项目
- QGraphicsDropShadowEffect - 在项目后面渲染阴影
- QGraphicsColorizeEffect - 以任何给定颜色的阴影渲染项目
- QGraphicsOpacityEffect - 以不透明度渲染项目
有关如何使用每个效果的更多信息,请参阅特定效果的文档。
要创建自己的自定义效果,请创建QGraphicsEffect(或任何其他现有效果)的子类,并重新实现虚拟函数draw()。此函数在效果需要重新绘制时被调用。该draw()函数将用作绘制画家作为参数。有关更多信息,请参阅draw()的文档。在draw()函数中,您可以调用sourcePixmap()以获取图形效果源的位图,然后可以对其进行处理。
如果您的效果发生变化,请使用update()请求重新绘制。如果您的自定义效果更改了源的边界框,例如,径向发光效果可能需要应用额外的边距,您可以重新实现虚拟函数boundingRectFor,并调用updateBoundingRect()来通知框架何时发生此矩形更改。虚拟的sourceChanged()函数用于通知影响源已以某种方式发生变化 - 例如,如果源是QGraphicsRectItem且其矩形参数已更改。
另请参阅QGraphicsItem::setGraphicsEffect()和QWidget::setGraphicsEffect。
成员类型文档
枚举QGraphicsEffect::ChangeFlag
flags QGraphicsEffect::ChangeFlags
此枚举描述了QGraphicsEffectSource中发生了什么变化。
常量 | 值 | 描述 |
---|---|---|
QGraphicsEffect::SourceAttached | 0x1 | 效果安装在一个源上。 |
QGraphicsEffect::SourceDetached | 0x2 | 效果从源卸载。 |
QGraphicsEffect::SourceBoundingRectChanged | 0x4 | 源的边界矩形已更改。 |
QGraphicsEffect::SourceInvalidated | 0x8 | 源的视觉外观已更改。 |
QFlags<ChangeFlag>类型是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。
[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; } ... }
[信号]
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 参数。
当 system 为Qt::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公司(芬兰)及其全球子公司和附属公司的商标。所有其他商标均为其各自所有者的财产。