QCanvasPainterWidget Class
QCanvasPainterWidget est un widget permettant le rendu à l'aide d'QCanvasPainter. En savoir plus...
| En-tête : | #include <QCanvasPainterWidget> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS CanvasPainter) target_link_libraries(mytarget PRIVATE Qt6::CanvasPainter) |
| Depuis : | Qt 6.11 |
| Hérite de : | QRhiWidget |
Fonctions publiques
| QCanvasPainterWidget(QWidget *parent = nullptr) | |
| virtual | ~QCanvasPainterWidget() override |
| QColor | fillColor() const |
| void | grabCanvas(const QCanvasOffscreenCanvas &canvas, const QObject *context, Functor &&callback) |
| bool | hasSharedPainter() const |
| void | setFillColor(QColor color) |
| void | setSharedPainter(bool enable) |
Fonctions protégées
| void | beginCanvasPainting(QCanvasOffscreenCanvas &canvas) |
| void | endCanvasPainting() |
| virtual void | graphicsResourcesInvalidated() |
| virtual void | initializeResources(QCanvasPainter *painter) |
| virtual void | paint(QCanvasPainter *painter) |
| virtual void | prePaint(QCanvasPainter *painter) |
Fonctions protégées réimplémentées
| virtual bool | event(QEvent *event) override |
| virtual void | initialize(QRhiCommandBuffer *cb) override |
| virtual void | releaseResources() override |
| virtual void | render(QRhiCommandBuffer *cb) override |
Description détaillée
Implémentez la fonction virtuelle ` paint ` dans une sous-classe pour effectuer le rendu à l'aide d'un ` QCanvasPainter`.
L'extrait de code ci-dessous illustre la structure type d'une sous-classe de `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;
};Documentation des fonctions membres
[explicit] QCanvasPainterWidget::QCanvasPainterWidget(QWidget *parent = nullptr)
Crée un objet `QCanvasPainterWidget` avec l'parent` spécifié.
[override virtual noexcept] QCanvasPainterWidget::~QCanvasPainterWidget()
Supprime l'QCanvasPainterWidget.
[protected] void QCanvasPainterWidget::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()`.
L'extrait de code suivant, issu d'une sous-classe de ` QCanvasPainterWidget `, montre comment un canevas hors écran peut être rendu, puis utilisé comme image ou motif d'image lors du dessin du contenu du 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()
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().
[override virtual protected] bool QCanvasPainterWidget::event(QEvent *event)
Réimplémente : QRhiWidget::event(QEvent *e).
QColor QCanvasPainterWidget::fillColor() const
Renvoie la couleur de remplissage actuelle.
Voir aussi setFillColor().
template <typename Functor> void QCanvasPainterWidget::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 actuel (main/gui) 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é. 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(m_offscreenCanvas, this, [](const QImage &image) {
image.save("result.png");
});[virtual protected] void QCanvasPainterWidget::graphicsResourcesInvalidated()
Appelée lorsque des ressources graphiques sous-jacentes, telles que les textures, sont perdues.
Cela indique que les objets ` QCanvasImage ` renvoyés par `addImage()` ne sont plus valides et qu’il faut appeler à nouveau `addImage()`. Si l’implémentation de ` paint()` est telle que cela n’a pas d’importance, par exemple parce que les images ne sont pas utilisées ou que `addImage()` est toujours appelée, alors aucune action n’est nécessaire. Dans le cas contraire, il est recommandé d’activer un indicateur, ou une solution similaire, et d’agir en conséquence lors du prochain appel à paint().
Il en va de même pour les objets ` QCanvasOffscreenCanvas ` renvoyés par ` QCanvasPainter::createCanvas()`. Lorsque cette fonction est appelée, l’appel suivant de ` paint()` doit créer de nouveaux canevas et redessiner leur contenu.
Les ressources graphiques peuvent être perdues, par exemple, lorsque le widget est déplacé vers une nouvelle fenêtre de niveau supérieur, car cela implique qu’il soit associé à une nouvelle instance de QRhi.
Voir également QRhiWidget::releaseResources().
bool QCanvasPainterWidget::hasSharedPainter() const
Renvoie « true » si ce widget utilise un « painter » partagé.
Voir aussi setSharedPainter.
[override virtual protected] void QCanvasPainterWidget::initialize(QRhiCommandBuffer *cb)
Réimplémente : QRhiWidget::initialize(QRhiCommandBuffer *cb).
[virtual protected] void QCanvasPainterWidget::initializeResources(QCanvasPainter *painter)
Réimplémentez cette méthode pour initialiser les ressources à l'aide de painter. En règle générale, elle sera appelée une fois avant les premiers appels à prePaint() et paint(). Il existe toutefois une exception lorsque les ressources graphiques sont perdues ; voir graphicsResourcesInvalidated(). Dans ce cas, cette méthode sera à nouveau appelée par la suite.
L'implémentation par défaut est vide.
[virtual protected] void QCanvasPainterWidget::paint(QCanvasPainter *painter)
Réimplémentez cette méthode pour dessiner à l'aide de ` painter`.
Le widget est d'abord rempli avec ` fillColor()` ().
L'implémentation par défaut est vide.
[virtual protected] void QCanvasPainterWidget::prePaint(QCanvasPainter *painter)
Réimplémentez cette fonction pour effectuer le dessin dans un ou plusieurs canevas hors écran à l’aide de ` painter`.
L'implémentation par défaut est vide.
Voir également beginCanvasPainting() et endCanvasPainting().
[override virtual protected] void QCanvasPainterWidget::releaseResources()
Réimplémente : QRhiWidget::releaseResources().
[override virtual protected] void QCanvasPainterWidget::render(QRhiCommandBuffer *cb)
Réimplémente : QRhiWidget::render(QRhiCommandBuffer *cb).
void QCanvasPainterWidget::setFillColor(QColor color)
Définissez la couleur de remplissage sur color. Cette couleur sera utilisée pour dessiner l'arrière-plan de l'élément. La couleur par défaut est le noir.
Voir également fillColor().
void QCanvasPainterWidget::setSharedPainter(bool enable)
Désactivez le partage de painter si enable est false.
Si le partage de peintre est activé, toutes les instances d'QCanvasPainterWidget situées dans la même QWindow utiliseront le même QCanvasPainter. Cette fonction doit être définie tôt, par exemple dans le constructeur de la classe dérivée, et ne doit pas être modifiée par la suite.
Le partage de peintres est activé par défaut.
Si deux widgets utilisent des « painters » dédiés et non partagés, leurs ressources graphiques respectives, telles que celles sous-jacentes à QCanvasImage ou QOffscreenCanvas, ne seront pas visibles l’une pour l’autre. En revanche, si les widgets se trouvent dans la même fenêtre et que le partage est activé, ils peuvent utiliser les images ou les canevas créés par l’autre widget, car ils utilisent tous deux le même ` QCanvasPainter`.
Remarque : même lorsque enable est à « true », les « painters » ne sont pas partagés entre des widgets appartenant à des fenêtres différentes (widgets de niveau supérieur).
Voir également 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.