Qt Canvas Painter - Exemple de galerie
Démonstration des fonctionnalités de QCanvasPainter dans une application Qt Quick.

L'exemple de la galerie est une application Qt Quick qui présente une grande variété de fonctionnalités offertes par QCanvasPainter.
L'interface utilisateur est essentiellement un ListView, où le délégué est GalleryItem, un type implémenté en C++ et exposé à 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)
Avec Qt 5 et OpenGL, GalleryItem aurait pu être une sous-classe de QQuickPaintedItem. Avec Qt 6 et Canvas Painter, nous allons sous-classer QCanvasPainterItem, qui fournit un rendu accéléré via QCanvasPainter, au lieu d'utiliser le rendu logiciel simple de QQuickPaintedItem et QPainter.
L'implémentation de GalleryItem est simple. En réimplémentant la fonction virtuelle createItemRenderer(), nous créons une instance de GalleryItemRenderer, qui sous-classe QCanvasPainterItemRenderer.
GalleryItem::GalleryItem(QQuickItem *parent) : QCanvasPainterItem(parent) { } QCanvasPainterItemRenderer* GalleryItem::createItemRenderer() const { return new GalleryItemRenderer(); }
Le dessin proprement dit est implémenté dans cette classe :
class GalleryItemRenderer : public QCanvasPainterItemRenderer { public: explicit GalleryItemRenderer(); ~GalleryItemRenderer(); void initializeResources(QCanvasPainter *painter) override; void synchronize(QCanvasPainterItem *item) override; void paint(QCanvasPainter *painter) override;
initializeResources() enregistre les images, chargées via QImage, et les shaders pour les brosses personnalisées.
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 charge de copier les données de GalleryItem afin qu'elles puissent être accédées en toute sécurité sur le thread de rendu du graphe de scèneQt Quick par la suite :
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; } } }
L'implémentation de paint() effectue le rendu à l'aide de QCanvasPainter, en fonction de l'index actuel fourni par 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;
Les fonctions invoquées à partir d'ici utilisent l'API QCanvasPainter pour effectuer le rendu. A titre d'exemple :
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;
Consultez le code source complet de l'exemple ci-dessous pour plus de détails.
© 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.