Qt Canvas Painter - Ejemplo de Hello Widget
Demuestra el uso de QCanvasPainter y QCanvasPainterWidget.

El ejemplo implementa una subclase de QCanvasPainterWidget. Una o más instancias de este widget pueden ser añadidas en un QMdiArea dentro del QMainWindow.
QCanvasPainterWidget deriva a su vez de QRhiWidget, y utiliza siempre la renderización 3D acelerada a través de QRhi.
Las subclases de QCanvasPainterWidget querrán como mínimo implementar paint(). Este ejemplo también utiliza una imagen, cargada desde un archivo PNG.
class CanvasWidget : public QCanvasPainterWidget { public: CanvasWidget(); void initializeResources(QCanvasPainter *p) override; void paint(QCanvasPainter *p) override; void graphicsResourcesInvalidated() override; private: QCanvasImage m_image; };
La función paint() puede empezar a dibujar usando el proveedor QCanvasPainter inmediatamente:
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();
Ver QCanvasPainter, QCanvasBrush, QCanvasRadialGradient, QCanvasImagePattern, QCanvasImage, y QFont para más información sobre las características usadas por este ejemplo.
La imagen se utiliza como patrón, para rellenar la forma del corazón:
// Paint heart QCanvasImagePattern pattern(m_image, centerX, centerY, size * 0.08f, size * 0.05f); p->setFillStyle(pattern);
Cuando se trata de recursos como QCanvasImage y QCanvasOffscreenCanvas, éstos se gestionan en initializeResources() y 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() es meramente una conveniencia. En lugar de implementarlo, también se podría escribir lo siguiente en paint():
if (m_image.isNull()) m_image = p->addImage(QImage(":/qt-translucent.png"), QCanvasPainter::ImageFlag::Repeat);
Este ejemplo no reparte widgets entre ventanas, por lo que los recursos gráficos no se van a perder. No obstante, es un buen patrón asignar un objeto vacío por defecto a todas las variables QCanvasImage y QCanvasOffscreenCanvas en graphicsResourcesInvalidated().
La función main() crea un QMainWindow y un QMdiArea. Se pueden añadir múltiples instancias de la clase CanvasWidget como sub-ventanas. Debido a que hasSharedPainter() por defecto es true, y debido a que se colocan dentro del mismo widget de nivel superior, todos los widgets pintores compartirán el mismo QCanvasPainter y la infraestructura de renderizado asociada, en lugar de crear otros dedicados.
© 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.