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 オブジェクトを簡単に管理できるようになります。これらはレンダラー内のメンバ変数として、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アーキテクチャによってはGPU→CPU間のコピーが含まれる場合があります。この関数は単一の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) を除いて返します。QQuickRhiItem::fixedColorBufferHeight が設定されていない限り、これは通常、ペインター項目のheight と同じ値になります。
[override virtual protected] void QCanvasPainterItemRenderer::initialize(QRhiCommandBuffer *cb)
QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb) を再実装します。
[virtual protected] void QCanvasPainterItemRenderer::initializeResources(QCanvasPainter *painter)
painter を使用してリソースを初期化するために、このメソッドを再実装してください。このメソッドは、最初のsynchronizeData() が呼び出される前に1 回呼び出されます。
注: 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 を使用します。
ペインター共有を無効にしたい場合は、この関数を十分に早い段階で、たとえば派生クラスのコンストラクタなどから呼び出す必要があります。アイテムがペイント用にすでに初期化されてしまった後で変更しても、効果はありません。
2 つのアイテムが、共有されていない専用のペインターを使用している場合、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) を除いて返します。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.