このページでは

QCanvasPainterWidget Class

QCanvasPainterWidget は、QCanvasPainter を使用して描画を行うためのウィジェットです。詳細...

ヘッダー: #include <QCanvasPainterWidget>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
以下より: Qt 6.11
継承元: QRhiWidget

パブリック関数

QCanvasPainterWidget(QWidget *parent = nullptr)
virtual ~QCanvasPainterWidget() override
QColor fillColor() const
void grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)
bool hasSharedPainter() const
void setFillColor(QColor color)
void setSharedPainter(bool enable)

プロテクト関数

void beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
void endCanvasPainting()
virtual void graphicsResourcesInvalidated()
virtual void initializeResources(QCanvasPainter *painter)
virtual void paint(QCanvasPainter *painter)
virtual void prePaint(QCanvasPainter *painter)

再実装されたプロテクト関数

virtual bool event(QEvent *event) override
virtual void initialize(QRhiCommandBuffer *cb) override
virtual void releaseResources() override
virtual void render(QRhiCommandBuffer *cb) override

詳細な説明

サブクラスでpaint 仮想関数を実装し、QCanvasPainter を使用してレンダリングを実行します。

以下のコードスニペットは、QCanvasPainterWidget サブクラスの典型的な構造を示しています:

class MyWidget : public QCanvasPainterWidget
{
public:
    void initializeResources(QCanvasPainter *p) override
    {
        // load assets
        if (m_image.isNull())
            m_image = p->addImage(QImage("image.png"), QCanvasPainter::ImageFlag::Repeat);
    }

    void paint(QCanvasPainter *p) override
    {
        // ... draw using m_image
    }

    void graphicsResourcesInvalidated() override
    {
        // textures are lost, indicate the need for reload
        m_image = {};
    }

    QCanvasImage m_image;
};

メンバ関数のドキュメント

[explicit] QCanvasPainterWidget::QCanvasPainterWidget(QWidget *parent = nullptr)

指定されたparent を使用して、QCanvasPainterWidgetを構築します。

[override virtual noexcept] QCanvasPainterWidget::~QCanvasPainterWidget()

QCanvasPainterWidget を削除します。

[protected] void QCanvasPainterWidget::beginCanvasPainting(QCanvasOffscreenCanvas &canvas)

canvas を対象とするQCanvasPainter の描画コマンドの記録を開始します。

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

prePaint() から戻る前に、beginCanvasPainting() の後には必ず対応するendCanvasPainting() が続いていなければなりません。

QCanvasPainterWidget のサブクラスからの以下のスニペットは、オフスクリーン・キャンバスにレンダリングを行い、ウィジェットのコンテンツを描画する際に、それを画像または画像パターンとして使用する方法を示しています:

class MyWidget : public QCanvasPainterWidget
{
public:
    QCanvasOffscreenCanvas canvas;
    QCanvasImage canvasImage;

    void graphicsResourcesInvalidated() override
    {
        canvas = {}; // so that the next prePaint() will recreate and redraw the canvas
    }

    void prePaint(QCanvasPainter *p) override
    {
        if (canvas.isNull()) {
            canvas = p->createCanvas(QSize(320, 240));
            beginCanvasPainting(canvas);
            p->beginPath();
            p->circle(160, 120, 20);
            p->setFillStyle(Qt::red);
            p->fill();
            endCanvasPainting();
            canvasImage = p->addImage(canvas, QCanvasPainter::ImageFlag::Repeat);
        }
    }

    void paint(QCanvasPainter *p) override
    {
        // use canvasImage as a brush or with drawImage()
    }
};

[protected] void QCanvasPainterWidget::endCanvasPainting()

beginCanvasPainting() で指定されたキャンバスを対象とする描画の終了を示します。

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

beginCanvasPainting prePaint() から戻る前に、必ず () の直後に、対応する endCanvasPainting() を呼び出す必要があります。

[override virtual protected] bool QCanvasPainterWidget::event(QEvent *event)

QRhiWidget::event(QEvent *e) を再実装します。

QColor QCanvasPainterWidget::fillColor() const

現在の塗りつぶし色を返します。

setFillColor()も参照してください 。

template <typename Functor> void QCanvasPainterWidget::grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)

canvas に対してテクスチャの読み出し要求を発行し、context と関連付けます。

callback は、関数が戻る前、あるいはそれ以降に、現在の(メイン/GUI)スレッド上で呼び出されます。これは、基盤となる `QRhi ` および 3D API の実装によって異なります。テクスチャ内容の読み出しには、GPU アーキテクチャによっては GPU から CPU へのコピーが含まれる場合があります。この関数は単一の `const QImage & ` 引数を取り、移動専用(move-only)のものを含め、任意のファンクタを指定できます。

読み込みが完了する前にcontext が破棄された場合、グラブはキャンセルされ、callback は呼び出されません。これにより、コールバック内で、保留中の読み込みが完了する前に存在しなくなる可能性のあるオブジェクトを参照しても安全です。

たとえば、以下のコードは、画面外にあるキャンバスの内容をPNGファイルに保存します:

grabCanvas(m_offscreenCanvas, this, [](const QImage &image) {
    image.save("result.png");
});

[virtual protected] void QCanvasPainterWidget::graphicsResourcesInvalidated()

テクスチャなどの基盤となるグラフィックリソースが失われた際に呼び出されます。

これは、addImage() から返された `QCanvasImage ` オブジェクトがもはや有効ではなく、addImage() を再度呼び出す必要があることを示しています。例えば、画像が使用されていない場合や、常に addImage() が呼び出される場合など、paint() の実装上これが問題にならない場合は、何もしなくても構いません。 それ以外の場合は、フラグを切り替えるなどして、次回のpaint()の呼び出し時にそれに応じて処理を行うことを推奨します。

これは、QCanvasPainter::createCanvas() から返されるQCanvasOffscreenCanvas オブジェクトについても同様です。この関数が呼び出された場合、次のpaint() の呼び出しでは、新しいキャンバスを作成し、その内容を再描画する必要があります。

たとえば、ウィジェットが新しいトップレベルウィンドウに移動された場合、新しいQRhi インスタンスに関連付けられることになるため、グラフィックスリソースが失われる可能性があります。

QRhiWidget::releaseResources()も参照してください 。

bool QCanvasPainterWidget::hasSharedPainter() const

このウィジェットが共有ペインターを使用している場合、true を返します。

setSharedPainterも参照してください 。

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

QRhiWidget::initialize(QRhiCommandBuffer *cb) を再実装します。

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

painter を使用してリソースを初期化するには、このメソッドを再実装してください。通常、このメソッドは、最初のprePaint() およびpaint() が呼び出される前に 1 回呼び出されます。ただし、グラフィックリソースが失われた場合は例外となります(graphicsResourcesInvalidated() を参照)。その場合、このメソッドはその後再度呼び出されます。

デフォルトの実装は空です。

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

painter を使用して描画を行うよう、このメソッドを再実装してください。

ウィジェットはまず、fillColor() を使用して塗りつぶされます。

デフォルトの実装では、何も描画されません。

[virtual protected] void QCanvasPainterWidget::prePaint(QCanvasPainter *painter)

painter を使用して、1つまたは複数のオフスクリーン・キャンバスへの描画を行うよう、この関数を再実装してください。

デフォルトの実装は空です。

beginCanvasPainting() およびendCanvasPainting()も参照してください 。

[override virtual protected] void QCanvasPainterWidget::releaseResources()

QRhiWidget::releaseResources() を再実装します。

[override virtual protected] void QCanvasPainterWidget::render(QRhiCommandBuffer *cb)

QRhiWidget::render(QRhiCommandBuffer *cb) を再実装します。

void QCanvasPainterWidget::setFillColor(QColor color)

塗りつぶしの色を `color` に設定します。この色は、項目の背景を描画する際に使用されます。デフォルトの色は黒です。

「fillColor()」も参照してください 。

void QCanvasPainterWidget::setSharedPainter(bool enable)

enable がfalse の場合、ペインター共有を無効にします。

ペインター共有が有効になっている場合、同じQWindow 内のすべてのQCanvasPainterWidget インスタンスは、同じQCanvasPainter を使用します。この関数は、派生クラスのコンストラクタ内など、早い段階で定義されなければならず、その後変更してはなりません。

ペインターの共有はデフォルトで有効になっています。

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

注: enable がtrueの場合でも 、異なるウィンドウ(トップレベルウィジェット)に属するウィジェット間でペインターが共有されることはありません。

「hasSharedPainter」も参照してください 。

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