QCanvasPainterItemRenderer Class
QCanvasPainterItemRenderer 负责处理QCanvasPainterItem 的所有绘制工作。更多内容...
| 标题: | #include <QCanvasPainterItemRenderer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter) target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| 自: | Qt 6.11 |
| 继承自: | QQuickRhiItemRenderer |
公共函数
| QCanvasPainterItemRenderer() | |
| virtual | ~QCanvasPainterItemRenderer() override |
| QColor | fillColor() const |
| bool | hasSharedPainter() const |
| qreal | height() const |
| QCanvasPainter * | painter() const |
| void | setSharedPainter(bool enable) |
| qreal | width() const |
受保护函数
| void | beginCanvasPainting(QCanvasOffscreenCanvas &canvas) |
| void | endCanvasPainting() |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback) |
| virtual void | initializeResources(QCanvasPainter *painter) |
| virtual void | paint(QCanvasPainter *painter) |
| virtual void | prePaint(QCanvasPainter *painter) |
| virtual void | synchronizeData(QCanvasPainterItem *item) |
重新实现的受保护函数
| virtual void | initialize(QRhiCommandBuffer *cb) override |
| virtual void | render(QRhiCommandBuffer *cb) override |
| virtual void | synchronize(QQuickRhiItem *item) override |
详细说明
实现paint() 方法以执行渲染。
为了以线程安全的方式将项目中的数据暴露给渲染器,请实现synchronizeData() 方法。
渲染器对象存在于Qt Quick 场景图渲染线程(如果存在)上并在此线程上运行,因为createItemRenderer()以及该类中的所有函数都是在该线程上调用的。
如果将QCanvasPainterItem 移动到另一个window 中,它将与一个新的QRhi 相关联。因此,渲染器对象会被自动销毁,并通过再次调用createItemRenderer()创建一个新的对象。 这使得对QCanvasImage 和QCanvasOffscreenCanvas 对象的管理变得简单,因为它们可以作为渲染器(renderer)的成员变量,在initializeResources() 或paint() 中进行初始化,且无需在因窗口和QRhi 变化导致图形资源丢失时重新设置它们——因为这一切都通过整个渲染器对象的销毁而隐式完成。
下面的代码片段展示了 QCanvasPainterItemRenderer 子类的典型结构。有关MyItem 类的示例,请参阅QCanvasPainterItem 。
class MyRenderer : public QCanvasPainterItemRenderer
{
public:
void synchronizeData(QCanvasPainterItem *item) override
{
// copy a custom property value from item in a thread-safe manner
m_value = static_cast<MyItem *>(item)->value();
}
void initializeResources(QCanvasPainter *p) override
{
// load assets
if (m_image.isNull())
m_image = p->addImage(QImage("image.png"), QCanvasPainter::ImageFlag::Repeat);
}
void prePaint(QCanvasPainter *p) override
{
// this is where offscreen canvases are drawn into
if (m_canvas.isNull()) {
m_canvas = p->createCanvas(QSize(640, 480));
beginCanvasPainting(m_canvas);
// ... draw into the offscreen canvas
endCanvasPainting();
m_canvasImage = p->addImage(m_canvas);
}
}
void paint(QCanvasPainter *p) override
{
QPointF center(width() / 2, height() / 2);
// ... draw using m_value, m_image, and m_canvasImage
}
QCanvasImage m_image;
QCanvasOffscreenCanvas m_canvas;
QCanvasImage m_canvasImage;
float m_value;
};另请参阅 QCanvasPainterItem 。
成员函数文档
QCanvasPainterItemRenderer::QCanvasPainterItemRenderer()
创建一个 QCanvasPainterItemRenderer。
[override virtual noexcept] QCanvasPainterItemRenderer::~QCanvasPainterItemRenderer()
销毁QCanvasPainterItemRenderer 。
[protected] void QCanvasPainterItemRenderer::beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
开始录制针对canvas 的QCanvasPainter 绘制命令。
注意:此 函数仅应从prePaint() 中调用。
在从prePaint() 返回之前,必须始终在 beginCanvasPainting() 之后调用相应的endCanvasPainting()。
[protected] void QCanvasPainterItemRenderer::endCanvasPainting()
表示结束针对beginCanvasPainting()中指定的画布进行的绘制操作。
注意:此 函数仅应从prePaint() 中调用。
beginCanvasPainting在从prePaint() 返回之前,() 之后必须始终跟上相应的 endCanvasPainting()。
QColor QCanvasPainterItemRenderer::fillColor() const
返回该项的当前填充颜色。该属性可由父级QCanvasPainterItem 进行设置。
[protected] template <typename Functor> void QCanvasPainterItemRenderer::grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)
针对canvas 发出纹理回读请求,并将该请求与context 关联。
callback 该函数将在渲染线程上被调用,具体时机取决于底层的QRhi 和3D API实现,可能在函数返回之前,也可能在返回之后。读取纹理内容可能涉及GPU→CPU的复制操作,具体取决于GPU架构。该函数接受一个const QImage & 参数,该参数可以是任何函数对象,包括仅支持移动的函数对象。
如果context 在读回操作完成前被销毁,则抓取操作将被取消,且不会调用callback 。这使得回调函数可以安全地引用那些可能在待处理的读回操作完成前就已销毁的对象。
例如,以下代码将把屏幕外的画布内容保存到 PNG 文件中:
grabCanvas(offscreenCanvas, item, [](const QImage &image) {
image.save("result.png");
});bool QCanvasPainterItemRenderer::hasSharedPainter() const
如果该项渲染器使用共享绘制器,则返回true 。
另请参阅 setSharedPainter 。
qreal QCanvasPainterItemRenderer::height() const
返回绘制区域的高度(以逻辑单位为单位),且不包含scale factor (device pixel ratio) 。该值通常与绘制项的height 相同,除非已设置QQuickRhiItem::fixedColorBufferHeight 。
[override virtual protected] void QCanvasPainterItemRenderer::initialize(QRhiCommandBuffer *cb)
重写了:QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb)。
[virtual protected] void QCanvasPainterItemRenderer::initializeResources(QCanvasPainter *painter)
重写此方法,以使用painter 初始化资源。该方法将在首次调用synchronizeData()之前被调用一次。
注意: 当QCanvasPainterItem 的大小发生变化时,此 函数不会被调用。
另请参阅 QCanvasPainter::addImage 和QCanvasPainter::createCanvas 。
[virtual protected] void QCanvasPainterItemRenderer::paint(QCanvasPainter *painter)
重写此方法,以使用 `painter` 进行绘制。
当项通过fillColor() 填充完毕后,该方法将被调用。
paint() 由渲染线程调用。为安全访问项数据,请在synchronizeData() 中将其复制。
另请参阅 synchronizeData()。
QCanvasPainter *QCanvasPainterItemRenderer::painter() const
返回与该“画家”项关联的画家。
[virtual protected] void QCanvasPainterItemRenderer::prePaint(QCanvasPainter *painter)
该函数在渲染开始时通过painter 调用,且在paint()之前执行。
调用此函数时,尚无任何渲染目标处于活动状态。请调用beginCanvasPainting() 来初始化在离屏画布上的绘制。
另请参阅 beginCanvasPainting() 和endCanvasPainting()。
[override virtual protected] void QCanvasPainterItemRenderer::render(QRhiCommandBuffer *cb)
重写了:QQuickRhiItemRenderer::render(QRhiCommandBuffer *cb)。
void QCanvasPainterItemRenderer::setSharedPainter(bool enable)
如果enable 的值为false ,则禁用画笔共享。
“绘图器共享”功能默认处于启用状态。
当画笔共享功能启用时,同一QQuickWindow 内的所有画笔项将使用相同的QCanvasPainter 。
如果需要禁用绘图器共享,必须尽早调用此函数,例如在派生类的构造函数中调用。如果在此之后(即项目已为绘制完成初始化)进行更改,则不会产生任何效果。
如果两个项目使用专用的、非共享的绘图器,则彼此的图形资源(例如支持QCanvasImage 或QOffscreenCanvas的资源)对对方将不可见。而如果这些项目位于同一个窗口中,且启用了共享,它们就可以使用另一个项目创建的图像或画布,因为它们都使用同一个QCanvasPainter 。
注意:即使 enable 为 true,属于不同QQuickWindow 实例(进而属于不同场景图)的绘制器之间也不会共享。
另请参阅 hasSharedPainter 。
[override virtual protected] void QCanvasPainterItemRenderer::synchronize(QQuickRhiItem *item)
重写了:QQuickRhiItemRenderer::synchronize(QQuickRhiItem *item)。
[virtual protected] void QCanvasPainterItemRenderer::synchronizeData(QCanvasPainterItem *item)
重写此方法以同步item 与项绘制器实例之间的数据。每当需要重新绘制项时,该方法将在调用paint()之前被调用。
此方法是绘制器与项目之间安全地读写彼此变量的唯一位置。
通常,您应将 `item ` 通过 `static_cast` 转换为实际的项类型,然后进行数据交换。
qreal QCanvasPainterItemRenderer::width() const
返回绘制区域的宽度(以逻辑单位为单位),且不包含scale factor (device pixel ratio) 。该值通常与绘制项的width 相同,除非已设置QQuickRhiItem::fixedColorBufferWidth 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.