QOpenGLWindow Class
La classe `QOpenGLWindow` est une sous-classe pratique de ` QWindow ` permettant d'effectuer des opérations de dessin OpenGL. En savoir plus...
| En-tête : | #include <QOpenGLWindow> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake : | QT += opengl |
| Hérite de : | QPaintDeviceWindow |
Types publics
| enum | UpdateBehavior { NoPartialUpdate, PartialUpdateBlit, PartialUpdateBlend } |
Fonctions publiques
| QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr) | |
| QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr) | |
| virtual | ~QOpenGLWindow() |
| QOpenGLContext * | context() const |
| GLuint | defaultFramebufferObject() const |
| void | doneCurrent() |
| QImage | grabFramebuffer() |
| bool | isValid() const |
| void | makeCurrent() |
| QOpenGLContext * | shareContext() const |
| QOpenGLWindow::UpdateBehavior | updateBehavior() const |
Signaux
| void | frameSwapped() |
Fonctions protégées
| virtual void | initializeGL() |
| virtual void | paintGL() |
| virtual void | paintOverGL() |
| virtual void | paintUnderGL() |
| virtual void | resizeGL(int w, int h) |
Fonctions protégées réimplémentées
| virtual void | paintEvent(QPaintEvent *event) override |
| virtual void | resizeEvent(QResizeEvent *event) override |
Description détaillée
QOpenGLWindow est une version améliorée de QWindow qui permet de créer facilement des fenêtres effectuant un rendu OpenGL à l’aide d’une API compatible avec QOpenGLWidget. Contrairement à QOpenGLWidget, QOpenGLWindow ne dépend pas du module widgets et offre de meilleures performances.
Une application type créera une sous-classe de QOpenGLWindow et réimplémentera les fonctions virtuelles suivantes :
- initializeGL() pour initialiser les ressources OpenGL
- resizeGL() pour configurer les matrices de transformation et d’autres ressources dépendantes de la taille de la fenêtre
- paintGL() pour émettre des commandes OpenGL ou dessiner à l’aide de QPainter
Pour planifier un rafraîchissement, appelez la fonction ` update()`. Notez que cela n’entraînera pas immédiatement un appel à ` paintGL()`. Appeler ` update()` plusieurs fois de suite ne modifiera en rien le comportement.
Il s’agit d’un slot qui peut donc être connecté à un signal QChronoTimer::timeout() pour réaliser une animation. Notez toutefois que dans l’environnement OpenGL moderne, il est nettement préférable de s’appuyer sur la synchronisation avec la fréquence de rafraîchissement verticale de l’écran. Consultez setSwapInterval() pour une description de l’intervalle de rafraîchissement. Avec un intervalle de rafraîchissement de 1, ce qui est le cas par défaut sur la plupart des systèmes, l’appel swapBuffers(), exécuté en interne par QOpenGLWindow après chaque rafraîchissement, se bloquera et attendra le vsync. Cela signifie que dès que le rafraîchissement est terminé, une mise à jour peut à nouveau être programmée en appelant update(), sans avoir recours à des minuteries.
Pour demander une configuration spécifique pour le contexte, utilisez setFormat() comme pour tout autre QWindow. Cela permet, entre autres, de demander une version et un profil OpenGL donnés, ou d’activer les tampons de profondeur et de stencil.
Remarque : il incombe à l'application de s'assurer que les tampons de profondeur et de stencil sont bien demandés via l'interface du système de fenêtrage sous-jacent. Si la taille du tampon de profondeur demandée n'est pas supérieure à zéro, rien ne garantit qu'un tampon de profondeur sera disponible ; par conséquent, les opérations OpenGL liées au test de profondeur risquent de ne pas fonctionner comme prévu.
Les tailles couramment utilisées pour les tampons de profondeur et de stencil sont respectivement 24 et 8. Par exemple, une sous-classe de QOpenGLWindow pourrait effectuer cette opération dans son constructeur :
QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
setFormat(format);Contrairement à ` QWindow`, `QOpenGLWindow` permet d’ouvrir un « painter » sur elle-même et d’effectuer un dessin basé sur la méthode « QPainter ».
QOpenGLWindow prend en charge plusieurs comportements de mise à jour. Le comportement par défaut, ` NoPartialUpdate `, équivaut à un ` QWindow` classique basé sur OpenGL. En revanche, ` PartialUpdateBlit ` et ` PartialUpdateBlend ` s’alignent davantage sur le fonctionnement de ` QOpenGLWidget`, où un objet framebuffer supplémentaire dédié est toujours présent. Ces modes permettent, au prix d’une légère perte de performances, de ne rafraîchir qu’une petite zone à chaque actualisation et de conserver le reste du contenu de l’image précédente. Cela s’avère utile pour les applications qui effectuent un rendu incrémental à l’aide de QPainter, car elles n’ont ainsi pas à rafraîchir l’intégralité du contenu de la fenêtre à chaque appel à paintGL().
À l'instar de QOpenGLWidget, QOpenGLWindow prend en charge l'attribut Qt::AA_ShareOpenGLContexts. Lorsqu'il est activé, les contextes OpenGL de toutes les instances de QOpenGLWindow sont partagés entre elles. Cela permet d'accéder aux ressources OpenGL partageables de chacune d'entre elles.
Pour plus d’informations sur les graphiques dans Qt, consultez la section Graphiques.
Documentation sur les types de membres
enum QOpenGLWindow::UpdateBehavior
Cette énumération décrit la stratégie de mise à jour de l'QOpenGLWindow.
| Constante | Valeur | Description |
|---|---|---|
QOpenGLWindow::NoPartialUpdate | 0 | Indique que toute la surface de la fenêtre sera redessinée à chaque mise à jour et qu’aucun framebuffer supplémentaire n’est donc nécessaire. C’est le paramètre utilisé dans la plupart des cas et il équivaut au fonctionnement d’un dessin effectué directement via ` QWindow `. |
QOpenGLWindow::PartialUpdateBlit | 1 | Indique que le dessin effectué dans ` paintGL()` ne couvre pas l’intégralité de la fenêtre. Dans ce cas, un objet framebuffer supplémentaire est créé en arrière-plan, et le rendu effectué dans ` paintGL()` ciblera ce framebuffer. Ce framebuffer est ensuite copié sur le framebuffer par défaut de la surface de la fenêtre après chaque opération de peinture. Cela permet d’utiliser un code de dessin basé sur l’ QPainter dans paintGL() qui ne rafraîchit qu’une petite zone à la fois, car, contrairement à NoPartialUpdate, le contenu précédent est conservé. |
QOpenGLWindow::PartialUpdateBlend | 2 | Similaire à PartialUpdateBlit, mais au lieu d’utiliser des blits de framebuffer, le contenu du framebuffer supplémentaire est rendu en dessinant un quadrilatère texturé avec le mélange activé. Contrairement à PartialUpdateBlit, cela permet d’utiliser du contenu avec mélange alpha et fonctionne même lorsque glBlitFramebuffer n’est pas disponible. En termes de performances, ce paramètre est susceptible d’être légèrement plus lent que PartialUpdateBlit. |
Documentation des fonctions membres
[explicit] QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
Crée une nouvelle instance de `QOpenGLWindow` avec les paramètres ` parent ` et ` updateBehavior` fournis.
Voir également QOpenGLWindow::UpdateBehavior.
[explicit] QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
Crée une nouvelle instance de `QOpenGLWindow` avec les paramètres ` parent ` et ` updateBehavior` fournis. Le contexte de la `QOpenGLWindow` sera partagé avec ` shareContext`.
Voir également QOpenGLWindow::UpdateBehavior et shareContext.
[virtual noexcept] QOpenGLWindow::~QOpenGLWindow()
Détruit l'instance d'QOpenGLWindow, libérant ainsi ses ressources.
Le contexte de l'OpenGLWindow est rendu actif dans le destructeur, ce qui permet de détruire en toute sécurité tout objet enfant qui pourrait avoir besoin de libérer les ressources OpenGL appartenant au contexte fourni par cette fenêtre.
Avertissement : si vous disposez d’objets encapsulant des ressources OpenGL (tels que ` QOpenGLBuffer`, ` QOpenGLShaderProgram`, etc.) en tant que membres d’une sous-classe de ` QOpenGLWindow `, vous devrez peut-être également ajouter un appel à ` makeCurrent()` dans le destructeur de cette sous-classe. En raison des règles de destruction des objets en C++, ces objets seront détruits avant l’appel de cette fonction (mais après l’exécution du destructeur de la sous-classe) ; par conséquent, le fait de rendre le contexte OpenGL actif dans cette fonction intervient trop tard pour permettre leur suppression en toute sécurité.
Voir également makeCurrent.
QOpenGLContext *QOpenGLWindow::context() const
Renvoie l'QOpenGLContext utilisé par cette fenêtre ou 0 s'il n'est pas encore initialisé.
GLuint QOpenGLWindow::defaultFramebufferObject() const
Le descripteur de l'objet framebuffer utilisé par cette fenêtre.
Lorsque le comportement de mise à jour est défini sur « NoPartialUpdate », il n’existe pas d’objet framebuffer distinct. Dans ce cas, la valeur renvoyée correspond à l’ID du framebuffer par défaut.
Sinon, la valeur correspond à l'identifiant de l'objet framebuffer ou à « 0 » s'il n'est pas encore initialisé.
void QOpenGLWindow::doneCurrent()
Libère le contexte.
Dans la plupart des cas, il n'est pas nécessaire d'appeler cette fonction, car le widget s'assure que le contexte est correctement lié et libéré lors de l'appel de ` paintGL()`.
Voir également makeCurrent().
[signal] void QOpenGLWindow::frameSwapped()
Ce signal est émis une fois que l'buffer swap, susceptible de provoquer un blocage, a été effectuée. Les applications qui souhaitent actualiser leur affichage en continu, de manière synchronisée avec le rafraîchissement vertical, doivent appeler la fonction ` update()` à la réception de ce signal. Cela permet d'obtenir une expérience beaucoup plus fluide par rapport à l'utilisation traditionnelle des temporisateurs.
QImage QOpenGLWindow::grabFramebuffer()
Renvoie une copie du tampon d'image.
Remarque : il s'agit d'une opération potentiellement coûteuse, car elle s'appuie sur la fonction glReadPixels() pour relire les pixels. Cela peut être lent et bloquer le pipeline du GPU.
Remarque : lorsqu’elle est utilisée avec le comportement de mise à jour « NoPartialUpdate », l’image renvoyée peut ne pas contenir le contenu souhaité si elle est appelée après l’échange des tampons avant et arrière (à moins que l’option « preserved swap » ne soit activée dans l’interface du système de fenêtrage sous-jacent). Dans ce mode, la fonction lit à partir du tampon arrière et son contenu peut ne pas correspondre à celui affiché à l’écran (le tampon avant). Dans ce cas, les seules fonctions où cette fonction peut être utilisée en toute sécurité sont ` paintGL()` ou ` paintOverGL()`.
[virtual protected] void QOpenGLWindow::initializeGL()
Cette fonction virtuelle est appelée une seule fois avant le premier appel à ` paintGL()` ou ` resizeGL()`. Réimplémentez-la dans une sous-classe.
Cette fonction doit initialiser toutes les ressources et tous les états OpenGL requis.
Il n’est pas nécessaire d’appeler ` makeCurrent()` car cela a déjà été fait lors de l’appel de cette fonction. Notez toutefois que le tampon de trame, en cas d’utilisation du mode de mise à jour partielle, n’est pas encore disponible à ce stade ; évitez donc d’émettre des appels de dessin à partir d’ici. Reportez plutôt ces appels à ` paintGL()`.
Voir également paintGL() et resizeGL().
bool QOpenGLWindow::isValid() const
Renvoie « true » si les ressources OpenGL de la fenêtre, telles que le contexte, ont été initialisées avec succès. Notez que la valeur renvoyée est toujours « false » tant que la fenêtre n’est pas exposée (affichée).
void QOpenGLWindow::makeCurrent()
Prépare le rendu du contenu OpenGL pour cette fenêtre en activant le contexte correspondant et en associant l'objet framebuffer, s'il existe, à ce contexte.
Dans la plupart des cas, il n’est pas nécessaire d’appeler cette fonction, car elle est appelée automatiquement avant l’appel de ` paintGL()`. Elle est néanmoins fournie pour prendre en charge des scénarios avancés multithreads dans lesquels un thread autre que le thread de l’interface graphique ou le thread principal peut souhaiter mettre à jour le contenu de la surface ou du framebuffer. Voir QOpenGLContext pour plus d’informations sur les questions liées aux threads.
Cette fonction peut également être appelée lorsque la fenêtre native sous-jacente a déjà été détruite. Cela signifie qu’il est possible d’appeler cette fonction en toute sécurité depuis le destructeur d’une sous-classe de ` QOpenGLWindow `. S’il n’y a plus de fenêtre native, une surface hors écran est utilisée à la place. Cela garantit que les opérations de nettoyage des ressources OpenGL dans le destructeur fonctionneront toujours, à condition que cette fonction soit appelée en premier.
Voir également QOpenGLContext, context(), paintGL() et doneCurrent().
[override virtual protected] void QOpenGLWindow::paintEvent(QPaintEvent *event)
Réimplémente : QPaintDeviceWindow::paintEvent(QPaintEvent *event).
Peint le gestionnaire d'event. Appelle paintGL().
Voir également paintGL().
[virtual protected] void QOpenGLWindow::paintGL()
Cette fonction virtuelle est appelée chaque fois que le contenu de la fenêtre doit être redessiné. Réimplémentez-la dans une sous-classe.
Il n’est pas nécessaire d’appeler ` makeCurrent()` car cela a déjà été fait lors de l’appel de cette fonction.
Avant d’invoquer cette fonction, le contexte et le framebuffer, s’il y en a un, sont liés, et la fenêtre d’affichage est configurée par un appel à glViewport(). Aucun autre état n’est défini et aucun effacement ni dessin n’est effectué par le framework.
Remarque : lorsque vous utilisez un comportement de mise à jour partielle, comme ` PartialUpdateBlend`, le résultat de l’appel précédent à `paintGL()` est conservé et, après le dessin supplémentaire effectué lors de l’appel actuel de la fonction, le contenu est superposé ou fusionné avec le contenu dessiné directement dans la fenêtre par ` paintUnderGL()`.
Voir également initializeGL(), resizeGL(), paintUnderGL(), paintOverGL() et UpdateBehavior.
[virtual protected] void QOpenGLWindow::paintOverGL()
Cette fonction virtuelle est appelée après chaque appel de la fonction ` paintGL()`.
Lorsque le mode de mise à jour est défini sur ` NoPartialUpdate`, il n’y a aucune différence entre cette fonction et ` paintGL()` : le rendu effectué dans l’une ou l’autre donne le même résultat.
Tout comme paintUnderGL(), le rendu effectué dans cette fonction cible le framebuffer par défaut de la fenêtre, quel que soit le comportement de mise à jour. Elle est appelée après le retour de paintGL() et une fois que le blit (PartialUpdateBlit) ou le tracé de quad (PartialUpdateBlend) a été effectué.
Voir également paintGL(), paintUnderGL() et UpdateBehavior.
[virtual protected] void QOpenGLWindow::paintUnderGL()
La fonction virtuelle est appelée avant chaque appel à ` paintGL()`.
Lorsque le mode de mise à jour est défini sur ` NoPartialUpdate`, il n’y a aucune différence entre cette fonction et ` paintGL()` ; le rendu effectué dans l’une ou l’autre conduit au même résultat.
La différence devient significative lors de l’utilisation de ` PartialUpdateBlend`, où un objet framebuffer supplémentaire est utilisé. Dans ce cas, ` paintGL()` cible cet objet framebuffer supplémentaire, qui conserve son contenu, tandis que `paintUnderGL()` et ` paintOverGL()` ciblent le framebuffer par défaut, c’est-à-dire directement la surface de la fenêtre, dont le contenu est perdu après chaque image affichée.
Remarque : évitez de vous fier à cette fonction lorsque le comportement de mise à jour est « PartialUpdateBlit ». Ce mode implique de copier le tampon d'image supplémentaire utilisé par ` paintGL()` vers le tampon d'image par défaut après chaque appel de ` paintGL()`, écrasant ainsi tout le dessin généré dans cette fonction.
Voir également paintGL(), paintOverGL() et UpdateBehavior.
[override virtual protected] void QOpenGLWindow::resizeEvent(QResizeEvent *event)
Réimplémente : QWindow::resizeEvent(QResizeEvent *ev).
Redéfinit le gestionnaire d'event. Appelle la fonction resizeGL().
Voir également resizeGL().
[virtual protected] void QOpenGLWindow::resizeGL(int w, int h)
Cette fonction virtuelle est appelée chaque fois que le widget est redimensionné. Réimplémentez-la dans une sous-classe. La nouvelle taille est transmise via les paramètres ` w ` et ` h`.
Remarque : il s'agit simplement d'une fonction de commodité destinée à fournir une API compatible avec QOpenGLWidget. Contrairement à QOpenGLWidget, les classes dérivées sont libres de choisir de redéfinir resizeEvent() à la place de cette fonction.
Remarque : évitez d’émettre des commandes OpenGL à partir de cette fonction, car il se peut qu’aucun contexte ne soit actif au moment de son appel. Si cela ne peut être évité, appelez makeCurrent().
Remarque : il n’est pas nécessairede planifier des mises à jour à partir d’ici. Les systèmes de fenêtrage enverront des événements d’exposition qui déclencheront automatiquement une mise à jour.
Voir également initializeGL() et paintGL().
QOpenGLContext *QOpenGLWindow::shareContext() const
Renvoie l'QOpenGLContext s dont le partage a été demandé avec le ` QOpenGLContext` de cette fenêtre.
QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const
Renvoie le comportement de mise à jour de cet QOpenGLWindow.
© 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.