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.