このページでは

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
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() を再度呼び出すことで新しいレンダラーが作成される。これにより、QCanvasImage およびQCanvasOffscreenCanvas オブジェクトをレンダラー内のメンバ変数として、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)

canvas をターゲットとしたQCanvasPainter 描画コマンドの記録を開始する。

注意: この関数は、prePaint() からのみ呼び出す必要があります。

beginCanvasPainting() の後には、prePaint() から戻る前に、必ず対応する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 アーキテクチャによっては GPU->CPU コピーを伴うことがあります。

bool QCanvasPainterItemRenderer::hasSharedPainter() const

このアイテムレンダラが共有ペインターを使用している場合はtrue を返します。

setSharedPainterも参照してください

float QCanvasPainterItemRenderer::height() const

描画領域の高さを、scale factor (device pixel ratio) を除いた論理単位で返します。 これは通常、QQuickRhiItem::fixedColorBufferHeight が設定されていない限り、ペインター項目のheight と同じです。

[override virtual protected] void QCanvasPainterItemRenderer::initialize(QRhiCommandBuffer *cb)

再実装:QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb)。

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

painter を使ってリソースを初期化するには、このメソッドを再実装する。この関数は、最初のsynchronize() の前に一度だけ呼び出される。

注意: QCanvasPainterItem のサイズが変更されると、この関数は呼び出されません。

QCanvasPainter::addImage およびQCanvasPainter::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 を使用します。

ペインター共有を無効にしたい場合は、この関数を十分に早い段階で、たとえば派生クラスのコンストラクタから呼び出す必要があります。アイテムがすでにペイント用に初期化された後でこの関数を変更しても、効果はありません。

2つのアイテムが専用の非共有ペインターを使用する場合、QCanvasImage や QOffscreenCanvas をバッキングしているものなど、互いのグラフィックリソースは表示されません。一方、アイテムが同じウィンドウ内にあり、共有が有効になっている場合は、どちらも同じQCanvasPainter を使用しているため、もう一方のアイテムが作成した画像やキャンバスを使用することができます。

注: enable が true の場合でも、異なるQQuickWindow インスタンス、ひいては異なるシーングラフに属するアイテム間では、ペインターは共有されません。

hasSharedPainterも参照してください

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

このメソッドを再実装して、item と item painter インスタンス間のデータを同期させます。このメソッドはアイテムが再描画されるたびにpaint() の前に呼び出されます。

このメソッドは、ペインターとアイテムがお互いの変数を読み書きしても安全な唯一の場所です。

通常は、item を static_cast して実際のアイテム・タイプに変換し、データを交換します。

注意: このオーバーロードは、QQuickRhiItem を受け取るbase class' version の代わりに、QCanvasPainterItem を受け取るように再実装してください。

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

再インプリメント:QQuickRhiItemRenderer::synchronize(QQuickRhiItem *item)。

float QCanvasPainterItemRenderer::width() const

描画領域の幅を、scale factor (device pixel ratio) を除いた論理単位で返します。 これは通常、QQuickRhiItem::fixedColorBufferWidth が設定されていない限り、ペインター項目のwidth と同じです。

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