En esta página

QCanvasPainterWidget Class

QCanvasPainterWidget es un widget para renderizar usando QCanvasPainter. Más...

Cabecera: #include <QCanvasPainterWidget>
CMake: find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Desde: Qt 6.11
Hereda de: QRhiWidget
Estado: Technical Preview

Funciones Públicas

QCanvasPainterWidget(QWidget *parent = nullptr)
virtual ~QCanvasPainterWidget() override
QColor fillColor() const
void grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)
bool hasSharedPainter() const
void setFillColor(const QColor &color)
void setSharedPainter(bool enable)

Funciones protegidas

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

Funciones protegidas reimplementadas

virtual void initialize(QRhiCommandBuffer *cb) override
virtual void releaseResources() override
virtual void render(QRhiCommandBuffer *cb) override

Descripción detallada

Implementa la función virtual paint en una subclase para realizar el renderizado utilizando un QCanvasPainter.

El siguiente fragmento de código muestra la estructura típica de una subclase 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;
};

Documentación de Funciones Miembro

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

Construye un QCanvasPainterWidget con la dirección parent.

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

Destruye el QCanvasPainterWidget.

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

Inicia la grabación de los comandos de dibujo de QCanvasPainter dirigidos a canvas.

Nota: Esta función sólo debe ser llamada desde prePaint().

beginCanvasPainting() siempre debe ir seguida de la correspondiente endCanvasPainting() antes de volver de prePaint().

El siguiente fragmento de una subclase de QCanvasPainterWidget muestra cómo un lienzo fuera de pantalla podría ser renderizado y luego utilizado como una imagen o patrón de imagen al dibujar el contenido para el widget:

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()

Indica el final del dibujo dirigido al lienzo especificado en beginCanvasPainting().

Nota: Esta función sólo debe ser llamada desde prePaint().

beginCanvasPainting() debe ir siempre seguida de la correspondiente endCanvasPainting() antes de volver de prePaint().

QColor QCanvasPainterWidget::fillColor() const

Devuelve el color de relleno actual.

Véase también setFillColor().

void QCanvasPainterWidget::grabCanvas(const QCanvasOffscreenCanvas &canvas, std::function<void (const QImage &)> callback)

Emite una solicitud de lectura de textura para canvas.

callback es invocada antes de que la función retorne, o más tarde, dependiendo de QRhi y de la implementación de la API 3D. La lectura del contenido de la textura puede implicar una copia GPU->CPU, dependiendo de la arquitectura de la GPU.

[virtual protected] void QCanvasPainterWidget::graphicsResourcesInvalidated()

Llamada cuando los recursos gráficos subyacentes, como las texturas, se pierden.

Esto indica que los objetos QCanvasImage devueltos por addImage() ya no son válidos, y addImage() necesita ser llamada de nuevo. Si la implementación de paint() es tal que esto no importa, por ejemplo porque no se utilizan imágenes, o siempre se llama a addImage(), entonces no es necesaria ninguna acción. En caso contrario, se recomienda activar una bandera, o similar, y actuar en consecuencia en la siguiente invocación de paint().

Lo mismo se aplica a los objetos QCanvasOffscreenCanvas devueltos por QCanvasPainter::createCanvas(). Cuando se llama a esta función, la siguiente invocación de paint() debería crear nuevos lienzos y redibujar su contenido.

Los recursos gráficos pueden perderse, por ejemplo, cuando el widget se traslada a una nueva ventana de nivel superior, porque eso implica asociarse a una nueva instancia de QRhi.

Véase también QRhiWidget::releaseResources().

bool QCanvasPainterWidget::hasSharedPainter() const

Devuelve true si este widget utiliza un pintor compartido.

Véase también setSharedPainter.

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

Reimplementa: QRhiWidget::initialize(QRhiCommandBuffer *cb).

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

Reimplemente este método para inicializar recursos utilizando painter. Generalmente, esto será llamado una vez antes del primer prePaint() y paint(). Una excepción es cuando se pierden recursos gráficos, ver graphicsResourcesInvalidated(). En ese caso, este método será invocado de nuevo después.

La implementación por defecto está vacía.

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

Reimplemente este método para pintar usando painter.

El widget se rellena primero con fillColor().

La implementación por defecto está vacía.

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

Reimplemente esta función para dibujar en uno o más lienzos fuera de pantalla utilizando painter.

La implementación por defecto está vacía.

Véase también beginCanvasPainting() y endCanvasPainting().

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

Reimplementa: QRhiWidget::releaseResources().

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

Reimplementa: QRhiWidget::render(QRhiCommandBuffer *cb).

void QCanvasPainterWidget::setFillColor(const QColor &color)

Establezca el color de relleno en color. Este color se utilizará para dibujar el fondo del elemento. El color por defecto es el negro.

Véase también fillColor().

void QCanvasPainterWidget::setSharedPainter(bool enable)

Desactiva la compartición de pintor si enable es false.

Si el pintor compartido está habilitado, todas las instancias de QCanvasPainterWidget dentro del mismo QWindow utilizarán el mismo QCanvasPainter. Esta función debe ser inicial, por ejemplo desde el constructor de la clase derivada, y no debe modificarse posteriormente.

La compartición de pintores está activada por defecto.

Si dos widgets utilizan pintores dedicados, no compartidos, los recursos gráficos del otro, como los que respaldan QCanvasImage o QOffscreenCanvas, no serán visibles para ellos. Mientras que si los widgets están en la misma ventana, y compartir está activado, pueden usar imágenes o lienzos creados por el otro widget, porque ambos usan el mismo QCanvasPainter.

Nota: Incluso cuando enable es verdadero, los pintores no se comparten entre widgets que pertenecen a ventanas diferentes (widgets de nivel superior).

Véase también 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.