在本页

QCanvasPainterItemRenderer Class

QCanvasPainterItemRenderer 处理QCanvasPainterItem 的所有绘制工作 ... 更多

Header: #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
float height() const
QCanvasPainter *painter() const
void setSharedPainter(bool enable)
float width() const

受保护函数

void beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
void endCanvasPainting()
void grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
virtual void initializeResources(QCanvasPainter *painter)
virtual void paint(QCanvasPainter *painter)
virtual void prePaint(QCanvasPainter *painter)
virtual void synchronize(QCanvasPainterItem *item)

重新实现的受保护函数

virtual void initialize(QRhiCommandBuffer *cb) override
virtual void render(QRhiCommandBuffer *cb) override
virtual void synchronize(QQuickRhiItem *item) override

详细说明

实现paint() 方法以执行渲染。

要以线程安全的方式将数据从项目暴露给呈现器,请执行synchronize() 方法。

如果存在Qt Quick 场景图呈现线程,则呈现器对象会在该线程上运行,因为createItemRenderer() 和该类中的所有函数都是在该线程上调用的。

如果QCanvasPainterItem 被移动到不同的window ,它将与新的QRhi 关联。因此,呈现器对象会被自动销毁,然后通过再次调用createItemRenderer() 创建一个新的呈现器对象。这样就可以简单地管理QCanvasImageQCanvasOffscreenCanvas 对象,因为它们可以作为呈现器中的成员变量,在initializeResources() 或paint() 中设置,而无需在窗口和QRhi 变化导致图形资源丢失时重置它们,因为这一切都是通过销毁整个呈现器对象隐式实现的。

下面的代码片段显示了 QCanvasPainterItemRenderer 子类的典型结构。有关MyItem 类的示例,请参见QCanvasPainterItem

class MyRenderer : public QCanvasPainterItemRenderer
{
public:
    void synchronize(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_canvas);
            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)

开始记录QCanvasPainter 针对canvas 的绘图命令。

注意: 该函数只能从prePaint() 中调用。

在从prePaint() 返回之前,beginCanvasPainting() 必须始终紧跟相应的endCanvasPainting() 。

[protected] void QCanvasPainterItemRenderer::endCanvasPainting()

表示以beginCanvasPainting() 中指定的画布为目标的绘图结束。

注意: 该函数只能从prePaint() 中调用。

beginCanvasPainting(在从prePaint() 返回之前,必须始终紧跟相应的 endCanvasPainting() 函数。)

QColor QCanvasPainterItemRenderer::fillColor() const

返回项目的当前填充颜色。可由父QCanvasPainterItem 设置。

[protected] void QCanvasPainterItemRenderer::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)

canvas 发出纹理回读请求。

callback 在函数返回之前或之后调用,具体取决于底层QRhi 和 3D API 实现。读回纹理内容可能涉及 GPU->CPU 复制,具体取决于 GPU 架构。

bool QCanvasPainterItemRenderer::hasSharedPainter() const

如果此项目呈现器使用共享绘制器,则返回true

另请参见 setSharedPainter

float 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 初始化资源。该函数将第一个synchronize()之前调用一次。

注意: QCanvasPainterItem 的大小发生变化时,不会调用此函数。

另请参阅 QCanvasPainter::addImageQCanvasPainter::createCanvas

[virtual protected] void QCanvasPainterItemRenderer::paint(QCanvasPainter *painter)

重新实现此方法,使用painter 进行绘制。

fillColor() 填充项目后,该方法将被调用。

paint() 由呈现器线程调用。要安全访问项目数据,请将其复制到synchronize() 中。

另请参见 synchronize()。

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)

如果enablefalse ,则禁用画家共享。

画图器共享默认为启用。

启用绘画器共享后,同一QQuickWindow 中的所有绘画器项目都将使用相同的QCanvasPainter

如果希望禁用绘画器共享,必须尽早调用该函数,例如在派生类的构造函数中调用。之后,当项已经初始化为绘画时,再更改该函数将不会有任何效果。

如果两个项目使用专用的非共享绘制器,则彼此的图形资源(如支持QCanvasImage 或 QOffscreenCanvas 的图形资源)对它们来说都是不可见的。而如果两个项目在同一个窗口中,并且启用了共享,它们就可以使用另一个项目创建的图像或画布,因为它们都使用相同的QCanvasPainter

注: 即使enable 为真,属于不同QQuickWindow 实例的项目之间也不能共享画家,进而也不能共享不同的场景图。

另请参阅 hasSharedPainter

[virtual protected] void QCanvasPainterItemRenderer::synchronize(QCanvasPainterItem *item)

重新实现此方法可在item 和 item painter 实例之间同步数据。每次项目需要重新绘制时,该方法将在paint() 之前被调用。

只有在该方法中,绘制器和项目才能安全地读写彼此的变量。

通常情况下,您应该将item static_cast 为真实的 item 类型,然后交换数据。

注意: 请确保重新实现此重载,使用QCanvasPainterItem ,而不是使用QQuickRhiItembase class' version

[override virtual protected] void QCanvasPainterItemRenderer::synchronize(QQuickRhiItem *item)

重实现:QQuickRhiItemRenderer::synchronize(QQuickRhiItem *item).

float 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.