Qt Canvas Painter - Ejemplo de Galería
Demuestra las características de QCanvasPainter en una aplicación Qt Quick.

Gallery example es una aplicación Qt Quick, que muestra una amplia variedad de características ofrecidas por QCanvasPainter.
La interfaz de usuario es esencialmente un ListView, donde el delegado es GalleryItem, un tipo implementado en C++ y expuesto a QML.
class GalleryItem : public QCanvasPainterItem { Q_OBJECT QML_NAMED_ELEMENT(GalleryItem) Q_PROPERTY(int galleryView READ galleryView WRITE setGalleryView NOTIFY galleryViewChanged) Q_PROPERTY(float animationTime READ animationTime WRITE setAnimationTime NOTIFY animationTimeChanged) Q_PROPERTY(float animationSine READ animationSine WRITE setAnimationSine NOTIFY animationSineChanged) Q_PROPERTY(float animState READ animState WRITE setAnimState NOTIFY animStateChanged)
Con Qt 5 y OpenGL, GalleryItem podría haber sido una subclase de QQuickPaintedItem. Con Qt 6 y Canvas Painter, subclasificaremos QCanvasPainterItem, que proporciona renderizado acelerado a través de QCanvasPainter, en lugar de utilizar el renderizado por software plano de QQuickPaintedItem y QPainter.
La implementación de GalleryItem es sencilla. Reimplementando la función virtual createItemRenderer(), creamos una instancia de GalleryItemRenderer, que subclase QCanvasPainterItemRenderer.
GalleryItem::GalleryItem(QQuickItem *parent) : QCanvasPainterItem(parent) { } QCanvasPainterItemRenderer* GalleryItem::createItemRenderer() const { return new GalleryItemRenderer(); }
El dibujo real se implementa en esta clase:
class GalleryItemRenderer : public QCanvasPainterItemRenderer { public: explicit GalleryItemRenderer(); ~GalleryItemRenderer(); void initializeResources(QCanvasPainter *painter) override; void synchronize(QCanvasPainterItem *item) override; void paint(QCanvasPainter *painter) override;
initializeResources() registra las imágenes, cargadas a través de QImage, y los shaders para los pinceles personalizados.
void GalleryItemRenderer::initializeResources(QCanvasPainter *painter) { QCanvasPainter::ImageFlags flags = QCanvasPainter::ImageFlag::Repeat | QCanvasPainter::ImageFlag::GenerateMipmaps; m_patternImage = painter->addImage(QImage(":/images/pattern1.png"), flags); m_patternImage2 = painter->addImage(QImage(":/images/pattern2.png"), flags); m_patternImage3 = painter->addImage(QImage(":/images/pattern3.png"), flags); m_testImage = painter->addImage(QImage(":/images/qt_development_white.png")); image3Gray = painter->addImage(QImage(":/images/face-smile-bw.png")); image3Plain = painter->addImage(QImage(":/images/pattern2.png")); image3Nearest = painter->addImage(QImage(":/images/pattern2.png"), QCanvasPainter::ImageFlag::Nearest); image3Mips = painter->addImage(QImage(":/images/pattern2.png"), QCanvasPainter::ImageFlag::GenerateMipmaps); image3NearestMips = painter->addImage(QImage(":/images/pattern2.png"), QCanvasPainter::ImageFlag::Nearest | QCanvasPainter::ImageFlag::GenerateMipmaps); m_customBrush.setFragmentShader(":/qcgalleryexample/brush1.frag.qsb"); m_customBrush2.setFragmentShader(":/qcgalleryexample/brush2.frag.qsb"); m_customBrush3.setFragmentShader(":/qcgalleryexample/brush3.frag.qsb"); m_customBrush3.setVertexShader(":/qcgalleryexample/brush3.vert.qsb"); m_customBrush4.setFragmentShader(":/qcgalleryexample/brush4.frag.qsb"); // Enable iTime animations m_customBrush.setTimeRunning(true); m_customBrush2.setTimeRunning(true); m_customBrush3.setTimeRunning(true); m_customBrush4.setTimeRunning(true); }
synchronize() se encarga de copiar los datos de GalleryItem para que se pueda acceder a ellos de forma segura en el hilo de renderizado del gráfico de escena deQt Quick más adelante:
void GalleryItemRenderer::synchronize(QCanvasPainterItem *item) { // Setting values here synchronized GalleryItem *realItem = static_cast<GalleryItem*>(item); if (realItem) { m_animationTime = realItem->animationTime(); m_animationSine = realItem->animationSine(); m_animState = realItem->animState(); m_viewIndex = realItem->galleryView(); if (!qFuzzyCompare(m_previousWidth, width()) || !qFuzzyCompare(m_previousHeight, height())) { m_sizeChanged = true; m_previousWidth = width(); m_previousHeight = height(); } else { m_sizeChanged = false; } } }
La implementación de paint() renderiza usando QCanvasPainter, dependiendo del índice actual proporcionado por ListView:
void GalleryItemRenderer::paint(QCanvasPainter *painter) { Q_UNUSED(painter) // Views not currently centered to have reduced // alpha and saturation. m_viewAlpha = 0.2 + 0.8 * m_animState; m_viewSaturate = m_animState; painter->setGlobalAlpha(m_viewAlpha); painter->setGlobalSaturate(m_viewSaturate); m_topMargin = height() * 0.02f; switch (m_viewIndex) { case 0: drawRectsWithLinearGradient(); drawRectsWithRadialGradient(); drawRectsWithBoxGradient(); drawRectsWithConicalGradients(); drawRectsWithImagePattern(); drawRectsWithBrushStroke(); break; case 1: drawImages(); break; case 2: drawGridPatterns(); break;
Las funciones invocadas desde aquí utilizan la API QCanvasPainter para realizar el renderizado. Por ejemplo:
void GalleryItemRenderer::drawRectsWithBrushStroke() { int rects = 3; float margin = width()*0.02f; float border = margin + margin * m_animationSine; float w = width() / (rects+2) - margin; float w2 = w - border; float posX = w + margin + border/2; float posY = m_topMargin + 5*(w+margin) + border/2; QRectF rect1(posX,posY,w2,w2); painter()->setLineWidth(border); painter()->setFillStyle(QCanvasImagePattern(m_patternImage3)); QCanvasLinearGradient g1(posX, posY, posX+w2, posY+w2); g1.setStartColor("#ffffff"); g1.setEndColor("#000000"); painter()->setStrokeStyle(g1); painter()->beginPath(); painter()->roundRect(rect1, border); painter()->fill(); painter()->stroke(); posX += w + margin;
Consulte el código fuente de ejemplo completo enlazado a continuación para obtener más detalles.
© 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.