Sur cette page

QOpenGLContext Class

La classe QOpenGLContext représente un contexte OpenGL natif, permettant le rendu OpenGL sur un site QSurface. Plus....

En-tête : #include <QOpenGLContext>
CMake : find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake : QT += gui
Héritages : QObject

Types publics

enum OpenGLModuleType { LibGL, LibGLES }

Fonctions publiques

QOpenGLContext(QObject *parent = nullptr)
virtual ~QOpenGLContext()
bool create()
GLuint defaultFramebufferObject() const
void doneCurrent()
QSet<QByteArray> extensions() const
QOpenGLExtraFunctions *extraFunctions() const
QSurfaceFormat format() const
QOpenGLFunctions *functions() const
QFunctionPointer getProcAddress(const QByteArray &procName) const
QFunctionPointer getProcAddress(const char *procName) const
bool hasExtension(const QByteArray &extension) const
bool isOpenGLES() const
bool isValid() const
bool makeCurrent(QSurface *surface)
QNativeInterface *nativeInterface() const
QScreen *screen() const
void setFormat(const QSurfaceFormat &format)
void setScreen(QScreen *screen)
void setShareContext(QOpenGLContext *shareContext)
QOpenGLContext *shareContext() const
QOpenGLContextGroup *shareGroup() const
QSurface *surface() const
void swapBuffers(QSurface *surface)

Signaux

Membres publics statiques

bool areSharing(QOpenGLContext *first, QOpenGLContext *second)
QOpenGLContext *currentContext()
QOpenGLContext *globalShareContext()
QOpenGLContext::OpenGLModuleType openGLModuleType()
bool supportsThreadedOpenGL()

Description détaillée

QOpenGLContext représente l'état OpenGL d'un contexte OpenGL sous-jacent. Pour initialiser un contexte, définissez son écran et son format afin qu'ils correspondent à ceux de la surface ou des surfaces avec lesquelles le contexte est censé être utilisé, si nécessaire, faites-lui partager des ressources avec d'autres contextes avec setShareContext(), et enfin appelez create(). Utilisez la valeur de retour ou isValid() pour vérifier si le contexte a été initialisé avec succès.

Un contexte peut être rendu courant par rapport à une surface donnée en appelant makeCurrent(). Lorsque le rendu OpenGL est terminé, appelez swapBuffers() pour échanger les tampons avant et arrière de la surface, de sorte que le contenu nouvellement rendu devienne visible. Pour pouvoir prendre en charge certaines plates-formes, QOpenGLContext exige que vous appeliez à nouveau makeCurrent() avant de commencer le rendu d'une nouvelle image, après avoir appelé swapBuffers().

Si le contexte n'est temporairement pas nécessaire, par exemple lorsque l'application n'effectue pas de rendu, il peut être utile de le supprimer afin de libérer des ressources. Vous pouvez vous connecter au signal aboutToBeDestroyed() pour nettoyer toutes les ressources qui ont été allouées avec une propriété différente de celle du QOpenGLContext lui-même.

Une fois qu'un QOpenGLContext a été mis à jour, vous pouvez effectuer un rendu de manière indépendante de la plate-forme en utilisant les facilitateurs OpenGL de Qt tels que QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, et QOpenGLFramebufferObject. Il est également possible d'utiliser l'API OpenGL de la plate-forme directement, sans utiliser les facilitateurs de Qt, bien que potentiellement au détriment de la portabilité. Cette dernière est nécessaire si l'on souhaite utiliser OpenGL 1.x ou OpenGL ES 1.x.

Pour plus d'informations sur l'API OpenGL, reportez-vous à la documentation officielle OpenGL.

Pour un exemple d'utilisation de QOpenGLContext, voir l'exemple OpenGL Window.

Affinité avec les threads

QOpenGLContext peut être déplacé dans un autre thread avec moveToThread(). N'appelez pas makeCurrent() depuis un thread différent de celui auquel appartient l'objet QOpenGLContext. Un contexte ne peut être actif que dans un seul thread et sur une seule surface à la fois, et un thread n'a qu'un seul contexte actif à la fois.

Partage des ressources du contexte

Les ressources telles que les textures et les objets tampons de vertex peuvent être partagées entre les contextes. Utilisez setShareContext() avant d'appeler create() pour spécifier que les contextes doivent partager ces ressources. QOpenGLContext garde en interne la trace d'un objet QOpenGLContextGroup auquel on peut accéder avec shareGroup(), et qui peut être utilisé pour trouver tous les contextes dans un groupe de partage donné. Un groupe de partage consiste en tous les contextes qui ont été initialisés avec succès et qui partagent avec un contexte existant dans le groupe de partage. Un contexte sans partage a un groupe de partage composé d'un seul contexte.

Mémoire tampon par défaut

Sur certaines plateformes, un framebuffer différent de 0 peut être le framebuffer par défaut en fonction de la surface courante. Au lieu d'appeler glBindFramebuffer(0), il est recommandé d'utiliser glBindFramebuffer(ctx->defaultFramebufferObject()), afin de garantir la portabilité de votre application entre les différentes plates-formes. Cependant, si vous utilisez QOpenGLFunctions::glBindFramebuffer(), cela est fait automatiquement pour vous.

Attention : WebAssembly

Nous recommandons qu'un seul QOpenGLContext soit rendu courant avec un QSurface, pour toute la durée de vie du QSurface. Si plus d'un contexte est utilisé, il est important de comprendre que plusieurs instances de QOpenGLContext peuvent être soutenues par le même contexte natif en dessous de la plate-forme WebAssembly. Par conséquent, appeler makeCurrent() avec le même QSurface sur deux objets QOpenGLContext ne peut pas basculer vers un contexte natif différent lors du second appel. En conséquence, tout changement d'état OpenGL effectué après le second makeCurrent() peut également modifier l'état du premier QOpenGLContext, puisqu'ils sont tous soutenus par le même contexte natif.

Note : Cela signifie que lorsque l'on cible WebAssembly avec du code Qt OpenGL existant, un certain portage peut être nécessaire pour tenir compte de ces limitations.

Voir aussi QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, et QOpenGLFramebufferObject.

Documentation sur les types de membres

enum QOpenGLContext::OpenGLModuleType

Cette énumération définit le type de l'implémentation OpenGL sous-jacente.

ConstanteValeurDescription
QOpenGLContext::LibGL0OpenGL
QOpenGLContext::LibGLES1OpenGL ES 2.0 ou supérieur

Documentation des fonctions membres

[explicit] QOpenGLContext::QOpenGLContext(QObject *parent = nullptr)

Crée une nouvelle instance de contexte OpenGL avec l'objet parent parent.

Avant de pouvoir l'utiliser, vous devez définir le format approprié et appeler create().

Voir aussi create() et makeCurrent().

[virtual noexcept] QOpenGLContext::~QOpenGLContext()

Détruit l'objet QOpenGLContext.

S'il s'agit du contexte actuel du thread, doneCurrent() est également appelé.

[signal] void QOpenGLContext::aboutToBeDestroyed()

Ce signal est émis avant que le contexte OpenGL natif sous-jacent ne soit détruit, afin que les utilisateurs puissent nettoyer les ressources OpenGL qui pourraient être laissées en suspens dans le cas de contextes OpenGL partagés.

Si vous souhaitez rendre le contexte actuel afin d'effectuer le nettoyage, assurez-vous de ne vous connecter au signal qu'en utilisant une connexion directe.

Note : Dans Qt for Python, ce signal ne sera pas reçu lorsqu'il est émis par le destructeur de QOpenGLWidget ou QOpenGLWindow car l'instance Python est déjà détruite. Nous recommandons de faire les nettoyages dans QWidget::hideEvent() à la place.

[static] bool QOpenGLContext::areSharing(QOpenGLContext *first, QOpenGLContext *second)

Renvoie true si les contextes first et second partagent des ressources OpenGL.

bool QOpenGLContext::create()

Tente de créer le contexte OpenGL avec la configuration actuelle.

La configuration actuelle comprend le format, le contexte de partage et l'écran.

Si l'implémentation OpenGL sur votre système ne supporte pas la version demandée du contexte OpenGL, alors QOpenGLContext essaiera de créer la version la plus proche. Les propriétés du contexte créé peuvent être interrogées à l'aide de la page QSurfaceFormat renvoyée par la fonction format(). Par exemple, si vous demandez un contexte qui supporte le profil OpenGL 4.3 Core mais que le pilote et/ou le matériel ne supporte que la version 3.2 Core, vous obtiendrez un contexte 3.2 Core.

Retourne true si le contexte natif a été créé avec succès et est prêt à être utilisé avec makeCurrent(), swapBuffers(), etc.

Remarque : si le contexte existe déjà, cette fonction détruit d'abord le contexte existant, puis en crée un nouveau.

Voir aussi makeCurrent() et format().

[static] QOpenGLContext *QOpenGLContext::currentContext()

Renvoie le dernier contexte qui a appelé makeCurrent dans le thread en cours, ou nullptr, si aucun contexte n'est en cours.

GLuint QOpenGLContext::defaultFramebufferObject() const

Appeler cette fonction pour obtenir l'objet framebuffer par défaut pour la surface courante.

Sur certaines plateformes (par exemple, iOS), l'objet framebuffer par défaut dépend de la surface sur laquelle le rendu est effectué, et peut être différent de 0. Ainsi, au lieu d'appeler glBindFramebuffer(0), vous devriez appeler glBindFramebuffer(ctx->defaultFramebufferObject()) si vous voulez que votre application fonctionne sur différentes plateformes Qt.

Si vous utilisez glBindFramebuffer() dans QOpenGLFunctions, vous n'avez pas à vous en soucier, car il lie automatiquement le defaultFramebufferObject() du contexte actuel lorsque 0 est passé.

Remarque : les widgets dont le rendu s'effectue via des objets framebuffer, comme QOpenGLWidget et QQuickWidget, remplaceront la valeur renvoyée par cette fonction lorsque la peinture est active, car à ce moment-là, le framebuffer "par défaut" correct est le framebuffer d'appui associé au widget, et non celui spécifique à la plate-forme qui appartient à la surface de la fenêtre de niveau supérieur. Cela garantit le comportement attendu pour cette fonction et les autres classes qui s'appuient sur elle (par exemple, QOpenGLFramebufferObject::bindDefault() ou QOpenGLFramebufferObject::release()).

Voir également QOpenGLFramebufferObject.

void QOpenGLContext::doneCurrent()

Fonction de commodité pour appeler makeCurrent avec une surface 0.

Il en résulte qu'aucun contexte n'est courant dans le fil d'exécution actuel.

Voir aussi makeCurrent() et currentContext().

QSet<QByteArray> QOpenGLContext::extensions() const

Renvoie l'ensemble des extensions OpenGL supportées par ce contexte.

Le contexte ou un contexte de partage doit être courant.

Voir aussi hasExtension().

QOpenGLExtraFunctions *QOpenGLContext::extraFunctions() const

Obtenir l'instance QOpenGLExtraFunctions pour ce contexte.

QOpenGLContext offre un moyen pratique d'accéder à QOpenGLExtraFunctions sans avoir à le gérer manuellement.

Le contexte ou un contexte de partage doit être courant.

L'instance QOpenGLExtraFunctions renvoyée est prête à être utilisée et n'a pas besoin d'appeler initializeOpenGLFunctions().

Note : QOpenGLExtraFunctions contient des fonctionnalités dont la disponibilité à l'exécution n'est pas garantie. La disponibilité au moment de l'exécution dépend de la plateforme, du pilote graphique et de la version d'OpenGL demandée par l'application.

Voir aussi QOpenGLFunctions et QOpenGLExtraFunctions.

QSurfaceFormat QOpenGLContext::format() const

Renvoie le format du contexte de la plate-forme sous-jacente, si create() a été appelé.

Sinon, il renvoie le format demandé.

Le format demandé et le format réel peuvent différer. Demander une version d'OpenGL donnée ne signifie pas que le contexte résultant ciblera exactement la version demandée. Il est seulement garanti que la combinaison version/profil/options pour le contexte créé est compatible avec la demande, tant que le pilote est capable de fournir un tel contexte.

Par exemple, la demande d'un contexte de profil de base OpenGL version 3.x peut résulter en un contexte de profil de base OpenGL 4.x. De même, une demande pour OpenGL 2.1 peut résulter en un contexte OpenGL 3.0 avec des fonctions dépréciées activées. Enfin, en fonction du pilote, les versions non supportées peuvent entraîner soit un échec de la création du contexte, soit un contexte pour la version supportée la plus élevée.

Des différences similaires sont possibles dans la taille des tampons, par exemple, le contexte résultant peut avoir un tampon de profondeur plus grand que celui demandé. C'est tout à fait normal.

Voir aussi setFormat().

QOpenGLFunctions *QOpenGLContext::functions() const

Obtenir l'instance QOpenGLFunctions pour ce contexte.

QOpenGLContext offre un moyen pratique d'accéder à QOpenGLFunctions sans avoir à le gérer manuellement.

Le contexte ou un contexte de partage doit être courant.

L'instance QOpenGLFunctions renvoyée est prête à être utilisée et ne nécessite pas l'appel de la fonction initializeOpenGLFunctions().

QFunctionPointer QOpenGLContext::getProcAddress(const QByteArray &procName) const

Résout le pointeur de fonction vers une fonction d'extension OpenGL, identifiée par procName

Retourne nullptr si aucune fonction de ce type ne peut être trouvée.

QFunctionPointer QOpenGLContext::getProcAddress(const char *procName) const

Il s'agit d'une fonction surchargée.

[static] QOpenGLContext *QOpenGLContext::globalShareContext()

Renvoie le contexte OpenGL partagé à l'échelle de l'application, s'il existe. Sinon, il renvoie nullptr.

Ceci est utile si vous devez télécharger des objets OpenGL (tampons, textures, etc.) avant de créer ou d'afficher une page QOpenGLWidget ou QQuickWidget.

Attention : N'essayez pas de rendre le contexte retourné par cette fonction courant sur une surface quelconque. Au lieu de cela, vous pouvez créer un nouveau contexte qui partage le contexte global, puis rendre le nouveau contexte courant.

Voir également Qt::AA_ShareOpenGLContexts, setShareContext() et makeCurrent().

bool QOpenGLContext::hasExtension(const QByteArray &extension) const

Retourne true si ce contexte OpenGL supporte l'OpenGL spécifié extension, false sinon.

Le contexte ou un contexte de partage doit être courant.

Voir aussi extensions().

bool QOpenGLContext::isOpenGLES() const

Retourne vrai si le contexte est un contexte OpenGL ES.

Si le contexte n'a pas encore été créé, le résultat est basé sur le format demandé via setFormat().

Voir aussi create(), format(), et setFormat().

bool QOpenGLContext::isValid() const

Retourne si ce contexte est valide, c'est-à-dire s'il a été créé avec succès.

Sur certaines plateformes, la valeur de retour de false pour un contexte qui a été créé avec succès précédemment indique que le contexte OpenGL a été perdu.

La façon typique de gérer les scénarios de perte de contexte dans les applications est de vérifier via cette fonction chaque fois que makeCurrent() échoue et renvoie false. Si cette fonction renvoie alors false, recréez le contexte OpenGL natif sous-jacent en appelant create(), appelez à nouveau makeCurrent() et réinitialisez toutes les ressources OpenGL.

Sur certaines plateformes, les situations de perte de contexte sont inévitables. Sur d'autres, en revanche, il peut être nécessaire de les accepter. Cela peut être fait en activant ResetNotification dans QSurfaceFormat. Cela conduira à configurer RESET_NOTIFICATION_STRATEGY_EXT à LOSE_CONTEXT_ON_RESET_EXT dans le contexte OpenGL natif sous-jacent. QOpenGLContext surveillera alors le statut via glGetGraphicsResetStatusEXT() dans chaque makeCurrent().

Voir aussi create().

bool QOpenGLContext::makeCurrent(QSurface *surface)

Rend le contexte actuel dans le thread actuel, par rapport à l'adresse surface. Renvoie true en cas de succès, sinon false. Ce dernier cas peut se produire si la surface n'est pas exposée ou si le matériel graphique n'est pas disponible parce que l'application est suspendue, par exemple.

Si surface est nullptr, cela équivaut à appeler doneCurrent().

Évitez d'appeler cette fonction à partir d'un thread différent de celui dans lequel se trouve l'instance QOpenGLContext. Si vous souhaitez utiliser QOpenGLContext à partir d'un autre thread, vous devez d'abord vous assurer qu'il n'est pas en cours dans le thread actuel, en appelant doneCurrent() si nécessaire. Ensuite, appelez moveToThread(otherThread) avant de l'utiliser dans l'autre thread.

Par défaut, Qt utilise une vérification qui applique la condition ci-dessus sur l'affinité des threads. Il est toujours possible de désactiver cette vérification en définissant l'attribut d'application Qt::AA_DontCheckOpenGLContextThreadAffinity. Assurez-vous de bien comprendre les conséquences de l'utilisation de QObjects en dehors du thread dans lequel ils vivent, comme expliqué dans la documentation QObject thread affinity.

Voir également functions(), doneCurrent() et Qt::AA_DontCheckOpenGLContextThreadAffinity.

template <typename QNativeInterface> QNativeInterface *QOpenGLContext::nativeInterface() const

Renvoie une interface native du type donné pour le contexte.

Cette fonction permet d'accéder aux fonctionnalités spécifiques à la plate-forme QOpenGLContext, telles que définies dans l'espace de noms QNativeInterface:

QNativeInterface::QCocoaGLContext

Interface native d'un contexte NSOpenGLC sur macOS

QNativeInterface::QEGLContext

Interface native avec un contexte EGL

QNativeInterface::QGLXContext

Interface native avec un contexte GLX

QNativeInterface::QWGLContext

Interface native avec un contexte WGL sous Windows

Si l'interface demandée n'est pas disponible, une adresse nullptr est renvoyée.

[static] QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()

Renvoie le type d'implémentation OpenGL sous-jacent.

Sur les plateformes où l'implémentation OpenGL n'est pas chargée dynamiquement, la valeur de retour est déterminée lors de la compilation et ne change jamais.

Note : Une implémentation OpenGL de bureau peut aussi être capable de créer des contextes compatibles avec ES. Par conséquent, dans la plupart des cas, il est plus approprié de vérifier QSurfaceFormat::renderableType() ou d'utiliser la fonction de commodité isOpenGLES().

Note : Cette fonction nécessite que l'instance QGuiApplication soit déjà créée.

QScreen *QOpenGLContext::screen() const

Renvoie l'écran pour lequel le contexte a été créé.

Voir aussi setScreen().

void QOpenGLContext::setFormat(const QSurfaceFormat &format)

Définit le site format avec lequel le contexte OpenGL doit être compatible. Vous devez appeler create() avant que cette fonction ne prenne effet.

Lorsque le format n'est pas explicitement défini par cette fonction, le format retourné par QSurfaceFormat::defaultFormat() sera utilisé. Cela signifie qu'en cas de contextes multiples, les appels individuels à cette fonction peuvent être remplacés par un seul appel à QSurfaceFormat::setDefaultFormat() avant de créer le premier contexte.

Voir aussi format().

void QOpenGLContext::setScreen(QScreen *screen)

Définit l'adresse screen pour laquelle le contexte OpenGL doit être valide. Vous devez appeler create() avant qu'elle ne prenne effet.

Voir aussi screen().

void QOpenGLContext::setShareContext(QOpenGLContext *shareContext)

Fait partager à ce contexte les textures, les shaders et les autres ressources OpenGL avec shareContext. Vous devez appeler create() avant que cela ne prenne effet.

Voir aussi shareContext().

QOpenGLContext *QOpenGLContext::shareContext() const

Renvoie le contexte de partage avec lequel ce contexte a été créé.

Si la plate-forme sous-jacente n'est pas en mesure de prendre en charge le partage demandé, la valeur renvoyée est 0.

Voir aussi setShareContext().

QOpenGLContextGroup *QOpenGLContext::shareGroup() const

Renvoie le groupe de partage auquel ce contexte appartient.

[static] bool QOpenGLContext::supportsThreadedOpenGL()

Renvoie true si la plateforme supporte le rendu OpenGL en dehors du thread principal (gui).

La valeur est contrôlée par le plugin de plateforme utilisé et peut également dépendre des pilotes graphiques.

QSurface *QOpenGLContext::surface() const

Renvoie la surface avec laquelle le contexte a été rendu courant.

Il s'agit de la surface transmise en tant qu'argument à makeCurrent().

void QOpenGLContext::swapBuffers(QSurface *surface)

Intervertit les tampons avant et arrière de surface.

Appelez ceci pour terminer une image de rendu OpenGL, et assurez-vous d'appeler à nouveau makeCurrent() avant d'émettre d'autres commandes OpenGL, par exemple dans le cadre d'une nouvelle image.

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