Qt Canvas Painter – Beispiel „Hello Widget“
Veranschaulicht die Verwendung von „ QCanvasPainter “ und „ QCanvasPainterWidget “.

Das Beispiel implementiert eine Unterklasse von „ QCanvasPainterWidget “. Eine oder mehrere Instanzen dieses Widgets können dann in ein „ QMdiArea “ innerhalb von „ QMainWindow “ eingefügt werden.
QCanvasPainterWidget selbst leitet sich von ` QRhiWidget` ab und nutzt stets beschleunigtes 3D-Rendering über ` QRhi`.
Unterklassen von ` QCanvasPainterWidget ` sollten mindestens die Methode ` paint()` implementieren. In diesem Beispiel wird zudem ein Bild verwendet, 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, 0, 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();Weitere Informationen zu den in diesem Beispiel verwendeten Funktionen finden Sie unter QCanvasPainter, QCanvasBrush, QCanvasRadialGradient, QCanvasImagePattern, QCanvasImage und QFont.
Das Bild wird als Muster zum Ausfüllen der Herzform verwendet:
// Paint heart
QCanvasImagePattern pattern(m_image, centerX, centerY, size * 0.08f, size * 0.05f);
p->setFillStyle(pattern);Wenn Ressourcen wie QCanvasImage und QCanvasOffscreenCanvas zum Einsatz kommen, 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() dient lediglich der Vereinfachung. Anstatt diese Funktion 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 Widgets nicht zwischen Fenstern neu zugeordnet, sodass Grafikressourcen nicht verloren gehen. Es ist dennoch ein bewährtes Muster, allen Variablen vom Typ „ QCanvasImage “ und „ QCanvasOffscreenCanvas “ in der Methode `graphicsResourcesInvalidated()` ein leeres Standardobjekt zuzuweisen.
Die Funktion `main()` erstellt ein ` QMainWindow ` und ein ` QMdiArea`. Es können mehrere Instanzen der Klasse `CanvasWidget` als Unterfenster hinzugefügt werden. Da ` hasSharedPainter()` standardmäßig auf `true` gesetzt ist und sich alle Widgets innerhalb desselben Top-Level-Widgets befinden, nutzen alle Painter-Widgets gemeinsam dasselbe ` 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.