Qt Canvas Painter - Hello Widget Beispiel
Demonstriert die Verwendung von QCanvasPainter und QCanvasPainterWidget.

Das Beispiel implementiert eine QCanvasPainterWidget Unterklasse. Eine oder mehrere Instanzen dieses Widgets können dann in eine QMdiArea innerhalb der QMainWindow eingefügt werden.
QCanvasPainterWidget QRhi selbst leitet sich von QRhiWidget ab und verwendet immer das beschleunigte 3D-Rendering über .
Unterklassen von QCanvasPainterWidget werden mindestens paint() implementieren wollen. Dieses Beispiel verwendet ebenfalls ein Bild, das aus einer PNG-Datei geladen wird.
class CanvasWidget : public QCanvasPainterWidget { public: CanvasWidget(); void initializeResources(QCanvasPainter *p) override; void paint(QCanvasPainter *p) override; void graphicsResourcesInvalidated() override; private: QCanvasImage m_image; };
Die Funktion paint() kann sofort mit dem Zeichnen unter Verwendung des Anbieters QCanvasPainter beginnen:
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();
Siehe QCanvasPainter, QCanvasBrush, QCanvasRadialGradient, QCanvasImagePattern, QCanvasImage und QFont für weitere Informationen über die in diesem Beispiel verwendeten Funktionen.
Das Bild wird als Muster verwendet, um die Herzform zu füllen:
// Paint heart QCanvasImagePattern pattern(m_image, centerX, centerY, size * 0.08f, size * 0.05f); p->setFillStyle(pattern);
Wenn Ressourcen wie QCanvasImage und QCanvasOffscreenCanvas beteiligt sind, werden diese in initializeResources() und graphicsResourcesInvalidated() verwaltet:
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() ist lediglich ein Hilfsmittel. Anstatt es zu implementieren, könnte man auch folgendes in paint() schreiben:
if (m_image.isNull()) m_image = p->addImage(QImage(":/qt-translucent.png"), QCanvasPainter::ImageFlag::Repeat);
In diesem Beispiel werden die Widgets nicht zwischen den Fenstern repariert, so dass die Grafikressourcen nicht verloren gehen. Es ist jedoch ein gutes Muster, allen QCanvasImage und QCanvasOffscreenCanvas Variablen in graphicsResourcesInvalidated() ein leeres Standardobjekt zuzuweisen.
Die Funktion main() erzeugt ein QMainWindow und QMdiArea. Mehrere Instanzen der CanvasWidget-Klasse können als Unterfenster hinzugefügt werden. Da hasSharedPainter() standardmäßig auf true gesetzt ist und innerhalb desselben Top-Level-Widgets platziert wird, teilen sich alle Maler-Widgets dieselbe QCanvasPainter und die zugehörige Rendering-Infrastruktur, anstatt eigene zu erstellen.
© 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.