Qt Canvas Painter - こんにちはウィジェットの例
QCanvasPainter とQCanvasPainterWidget の使用例を示します。

この例では、QCanvasPainterWidget のサブクラスを実装しています。このウィジェットの 1 つ以上のインスタンスをQMainWindow 内部のQMdiArea に追加できます。
QCanvasPainterWidget それ自体はQRhiWidget から派生しており、常にQRhi を介したアクセラレーテッド 3D レンダリングを使用しています。
QCanvasPainterWidget のサブクラスは、最低でもpaint() を実装したい。この例でも、PNG ファイルから読み込んだ画像を使用しています。
class CanvasWidget : public QCanvasPainterWidget { public: CanvasWidget(); void initializeResources(QCanvasPainter *p) override; void paint(QCanvasPainter *p) override; void graphicsResourcesInvalidated() override; private: QCanvasImage m_image; };
paint()関数は、プロバイダQCanvasPainter を使用してすぐに描画を開始できます:
void CanvasWidget::paint(QCanvasPainter *p) { const float size = std::min(width(), height()); const float centerX = width() / 2; const float centerY = height() / 2; // Paint the background circle QCanvasRadialGradient gradient1(centerX, centerY - size * 0.1f, size * 0.6f); gradient1.setStartColor(QColor(0x909090)); gradient1.setEndColor(QColor(0x404040)); p->beginPath(); p->circle(QPointF(centerX, centerY), size * 0.46f); p->setFillStyle(gradient1); p->fill(); p->setStrokeStyle(QColor(0x202020)); p->setLineWidth(size * 0.02f); p->stroke();
この例で使用している機能の詳細については、QCanvasPainter 、QCanvasBrush 、QCanvasRadialGradient 、QCanvasImagePattern 、QCanvasImage 、QFont を参照してください。
画像は、ハートの形を塗りつぶすためのパターンとして使用されます:
// Paint heart QCanvasImagePattern pattern(m_image, centerX, centerY, size * 0.08f, size * 0.05f); p->setFillStyle(pattern);
QCanvasImage やQCanvasOffscreenCanvas のようなリソースが関係する場合、これらはinitializeResources() やgraphicsResourcesInvalidated() で管理される:
void CanvasWidget::initializeResources(QCanvasPainter *p) { Q_ASSERT(m_image.isNull()); const auto flags = QCanvasPainter::ImageFlag::Repeat | QCanvasPainter::ImageFlag::GenerateMipmaps; m_image = p->addImage(QImage(u":/qt-translucent.png"_s), flags); } void CanvasWidget::graphicsResourcesInvalidated() { m_image = {}; }
initializeResources()は単なる便宜的なものです。これを実装する代わりに、paint()に次のように書くこともできる:
if (m_image.isNull()) m_image = p->addImage(QImage(":/qt-translucent.png"), QCanvasPainter::ImageFlag::Repeat);
この例では、ウィンドウ間でウィジェットを再ペアレントしないので、グラフィック・リソースが失われることはありません。とはいえ、graphicsResourcesInvalidated() ですべてのQCanvasImage とQCanvasOffscreenCanvas 変数にデフォルトの空のオブジェクトを代入するのは良いパターンです。
main()関数は、QMainWindow とQMdiArea を作成します。CanvasWidget クラスの複数のインスタンスをサブウィンドウとして追加できます。hasSharedPainter() のデフォルトが true であり、同じトップレベル・ウィジェット内に配置されるため、ペインタ・ウィジェットはすべて、専用のものを作成する代わりに、同じQCanvasPainter と関連するレンダリング・インフラストラクチャを共有します。
© 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.