Sur cette page

QCanvasPainterItemRenderer Class

Le `QCanvasPainterItemRenderer` gère l'ensemble du rendu graphique d'un ` QCanvasPainterItem`. En savoir plus...

En-tête : #include <QCanvasPainterItemRenderer>
CMake : find_package(Qt6 REQUIRED COMPONENTS CanvasPainter)
target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter)
Depuis : Qt 6.11
Hérite de : QQuickRhiItemRenderer

Fonctions publiques

QCanvasPainterItemRenderer()
virtual ~QCanvasPainterItemRenderer() override
QColor fillColor() const
bool hasSharedPainter() const
qreal height() const
QCanvasPainter *painter() const
void setSharedPainter(bool enable)
qreal width() const

Fonctions protégées

void beginCanvasPainting(QCanvasOffscreenCanvas &canvas)
void endCanvasPainting()
void grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)
virtual void initializeResources(QCanvasPainter *painter)
virtual void paint(QCanvasPainter *painter)
virtual void prePaint(QCanvasPainter *painter)
virtual void synchronizeData(QCanvasPainterItem *item)

Fonctions protégées réimplémentées

virtual void initialize(QRhiCommandBuffer *cb) override
virtual void render(QRhiCommandBuffer *cb) override
virtual void synchronize(QQuickRhiItem *item) override

Description détaillée

Implémentez la méthode paint() pour effectuer le rendu.

Pour exposer les données de l’élément au moteur de rendu de manière sûre au niveau des threads, implémentez la méthode synchronizeData().

L’objet rendu réside et fonctionne sur le thread de rendu du graphe de scèneQt Quick , s’il en existe un, car c’est sur ce thread que createItemRenderer() et toutes les fonctions de cette classe sont appelées.

Si l’ QCanvasPainterItem est déplacé vers un autre window, il sera associé à un nouveau QRhi. Par conséquent, l’objet « renderer » est automatiquement détruit, et un nouvel objet est créé en appelant à nouveau createItemRenderer(). Cela permet une gestion simple des objets ` QCanvasImage ` et ` QCanvasOffscreenCanvas `, car ceux-ci peuvent être des variables membres du `renderer`, initialisées soit dans ` initializeResources()` soit dans ` paint()`, sans qu’il soit nécessaire de les réinitialiser lorsque les ressources graphiques sont perdues en raison d’un changement de fenêtre ou d’un ` QRhi `, puisque tout se passe implicitement lors de la destruction de l’objet `renderer` dans son ensemble.

L'extrait de code ci-dessous illustre la structure typique d'une sous-classe de `QCanvasPainterItemRenderer`. Consultez QCanvasPainterItem pour un exemple de la classe ` MyItem `.

class MyRenderer : public QCanvasPainterItemRenderer
{
public:
    void synchronizeData(QCanvasPainterItem *item) override
    {
        // copy a custom property value from item in a thread-safe manner
        m_value = static_cast<MyItem *>(item)->value();
    }

    void initializeResources(QCanvasPainter *p) override
    {
        // load assets
        if (m_image.isNull())
            m_image = p->addImage(QImage("image.png"), QCanvasPainter::ImageFlag::Repeat);
    }

    void prePaint(QCanvasPainter *p) override
    {
        // this is where offscreen canvases are drawn into
        if (m_canvas.isNull()) {
            m_canvas = p->createCanvas(QSize(640, 480));
            beginCanvasPainting(m_canvas);
            // ... draw into the offscreen canvas
            endCanvasPainting();
            m_canvasImage = p->addImage(m_canvas);
        }
    }

    void paint(QCanvasPainter *p) override
    {
        QPointF center(width() / 2, height() / 2);
        // ... draw using m_value, m_image, and m_canvasImage
    }

    QCanvasImage m_image;
    QCanvasOffscreenCanvas m_canvas;
    QCanvasImage m_canvasImage;
    float m_value;
};

Voir également QCanvasPainterItem.

Documentation des fonctions membres

QCanvasPainterItemRenderer::QCanvasPainterItemRenderer()

Crée un objet `QCanvasPainterItemRenderer`.

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

Supprime l'QCanvasPainterItemRenderer.

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

Lance l'enregistrement des commandes de dessin d'QCanvasPainter ciblant canvas.

Remarque : cette fonction ne doit être appelée qu'à partir de ` prePaint()`.

La fonction `beginCanvasPainting()` doit toujours être suivie de la fonction ` endCanvasPainting()` correspondante avant de quitter la fonction ` prePaint()`.

[protected] void QCanvasPainterItemRenderer::endCanvasPainting()

Indique la fin du dessin sur le canevas spécifié dans la fonction ` beginCanvasPainting()`.

Remarque : cette fonction ne doit être appelée qu’à partir de prePaint().

beginCanvasPainting() doit toujours être suivie de la fonction correspondante endCanvasPainting() avant de quitter la fonction prePaint().

QColor QCanvasPainterItemRenderer::fillColor() const

Renvoie la couleur de remplissage actuelle de l'élément. Celle-ci peut être définie par l'QCanvasPainterItem parent.

[protected] template <typename Functor> void QCanvasPainterItemRenderer::grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback)

Émet une requête de relecture de texture pour canvas, en l'associant à context.

callback est appelée sur le thread de rendu soit avant que la fonction ne revienne, soit plus tard, selon l’implémentation sous-jacente de ` QRhi ` et de l’API 3D. La relecture du contenu de la texture peut impliquer une copie GPU→CPU, selon l’architecture du GPU. Elle prend un seul argument ` const QImage & ` et peut être n’importe quel foncteur, y compris ceux de type « move-only ».

Si l’ context est détruite avant la fin de la relecture, la capture est annulée et callback n’est pas appelée. Cela permet au callback de référencer en toute sécurité des objets qui pourraient ne pas survivre à la relecture en cours.

Par exemple, le code suivant permettrait d’enregistrer le contenu d’un canevas hors écran dans un fichier PNG :

grabCanvas(offscreenCanvas, item, [](const QImage &image) {
    image.save("result.png");
});

bool QCanvasPainterItemRenderer::hasSharedPainter() const

Renvoie ` true ` si ce rendu d'élément utilise un « painter » partagé.

Voir aussi setSharedPainter.

qreal QCanvasPainterItemRenderer::height() const

Renvoie la hauteur de la zone peinte, en unités logiques, sans tenir compte de l'scale factor (device pixel ratio). Cette valeur correspond généralement à celle de la propriété height de l'élément « painter », sauf si la propriété QQuickRhiItem::fixedColorBufferHeight a été définie.

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

Réimplémente : QQuickRhiItemRenderer::initialize(QRhiCommandBuffer *cb).

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

Réimplémentez cette méthode pour initialiser les ressources à l'aide de ` painter`. Elle sera appelée une seule fois avant le premier appel à ` synchronizeData()`.

Remarque : cette fonction n’est pas appelée lorsque la taille de ` QCanvasPainterItem ` change.

Voir également QCanvasPainter::addImage et QCanvasPainter::createCanvas.

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

Réimplémentez cette méthode pour effectuer le dessin à l'aide de ` painter`.

Cette méthode sera appelée une fois que l'élément aura été rempli via ` fillColor()`.

La méthode `paint()` est appelée depuis le thread du rendu. Pour accéder aux données de l'élément en toute sécurité, copiez-les dans ` synchronizeData()`.

Voir également synchronizeData().

QCanvasPainter *QCanvasPainterItemRenderer::painter() const

Renvoie le « painter » associé à cet élément « painter ».

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

Cette fonction est appelée au début du rendu via ` painter`, avant ` paint()`.

Aucune cible de rendu n'est active lorsque cette fonction est appelée. Appelez ` beginCanvasPainting()` pour initialiser le dessin dans un canevas hors écran.

Voir également beginCanvasPainting() et endCanvasPainting().

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

Réimplémente : QQuickRhiItemRenderer::render(QRhiCommandBuffer *cb).

void QCanvasPainterItemRenderer::setSharedPainter(bool enable)

Désactivez le partage du peintre si enable est false.

Le partage de peintre est activé par défaut.

Lorsque le partage de peintre est activé, tous les éléments « peintre » au sein d’une même instance de ` QQuickWindow ` utilisent le même ` QCanvasPainter`.

Si vous souhaitez désactiver le partage de peintre, cette fonction doit être appelée suffisamment tôt, par exemple depuis le constructeur de la classe dérivée. La modifier par la suite, une fois que l’élément a déjà été initialisé pour le dessin, n’aura aucun effet.

Si deux éléments utilisent des « painters » dédiés et non partagés, leurs ressources graphiques respectives, telles que celles associées à ` QCanvasImage ` ou à `QOffscreenCanvas`, ne seront pas visibles l’une pour l’autre. En revanche, si les éléments se trouvent dans la même fenêtre et que le partage est activé, ils peuvent utiliser les images ou les toiles créées par l’autre élément, car ils utilisent tous deux la même ` QCanvasPainter`.

Remarque : même lorsque enable est défini sur true, les « peintres » ne sont pas partagés entre les éléments appartenant à différentes instances d’ QQuickWindow et, par extension, à différents graphes de scène.

Voir également hasSharedPainter.

[override virtual protected] void QCanvasPainterItemRenderer::synchronize(QQuickRhiItem *item)

Réimplémente : QQuickRhiItemRenderer::synchronize(QQuickRhiItem *item).

[virtual protected] void QCanvasPainterItemRenderer::synchronizeData(QCanvasPainterItem *item)

Réimplémentez cette méthode pour synchroniser les données entre les instances de « item » et celles de « item painter ». Elle sera appelée avant la méthode paint() chaque fois que l'élément devra être redessiné.

Cette méthode est le seul endroit où le peintre et l’élément peuvent lire et écrire en toute sécurité les variables l’un de l’autre.

En général, vous devez effectuer un `static_cast` de ` item ` vers le type réel de votre `item`, puis échanger les données.

qreal QCanvasPainterItemRenderer::width() const

Renvoie la largeur de la zone peinte, en unités logiques, sans l'scale factor (device pixel ratio). Cette valeur correspond généralement à celle de la propriété « width » de l'élément « painter », sauf si la propriété « QQuickRhiItem::fixedColorBufferWidth » a été définie.

© 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.