QOpenGLContext Class
La classe `QOpenGLContext` représente un contexte OpenGL natif, permettant le rendu OpenGL sur une ` QSurface`. En savoir plus...
| En-tête : | #include <QOpenGLContext> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake : | QT += gui |
| Hérite de : | QObject |
- Liste de tous les membres, y compris les membres hérités
- QOpenGLContext fait partie du module « Rendu 3D ».
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
| void | aboutToBeDestroyed() |
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 configurer un contexte, définissez son écran et son format de manière à ce qu’ils correspondent à ceux de la ou des surfaces avec lesquelles le contexte est censé être utilisé ; si nécessaire, faites-le partager des ressources avec d’autres contextes à l’aide de ` setShareContext()` ; 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 défini comme contextuel par rapport à une surface donnée en appelant ` makeCurrent()`. Une fois le rendu OpenGL terminé, appelez ` swapBuffers()` pour permuter les tampons avant et arrière de la surface, afin que le contenu nouvellement rendu devienne visible. Pour prendre en charge certaines plateformes, QOpenGLContext exige que vous appeliez à nouveau la fonction makeCurrent() avant de commencer le rendu d’une nouvelle image, après avoir appelé la fonction 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 libérer 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é désigné comme contextuel, vous pouvez effectuer le rendu de manière indépendante de la plateforme en utilisant les facilitateurs OpenGL de Qt tels que ` QOpenGLFunctions`, ` QOpenGLBuffer`, ` QOpenGLShaderProgram` et ` QOpenGLFramebufferObject`. Il est également possible d’utiliser directement l’API OpenGL de la plateforme, sans recourir aux facilitateurs Qt, bien que cela puisse se faire au détriment de la portabilité. Cette dernière option est nécessaire si vous souhaitez utiliser OpenGL 1.x ou OpenGL ES 1.x.
Pour plus d’informations sur l’API OpenGL, consultez la documentation officielle d’OpenGL.
Pour un exemple d'utilisation de QOpenGLContext, consultez l'exemple « Fenêtre OpenGL ».
Affinité de thread
L'objet `QOpenGLContext` peut être déplacé vers un autre thread à l'aide de la fonction ` moveToThread()`. N'appelez pas la fonction ` 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 ne peut avoir qu'un seul contexte actif à la fois.
Partage des ressources du contexte
Les ressources telles que les textures et les objets de tampon de sommets peuvent être partagées entre les contextes. Utilisez ` setShareContext()` avant d’appeler ` create()` pour spécifier que les contextes doivent partager ces ressources. QOpenGLContext gère en interne un objet ` QOpenGLContextGroup ` accessible via ` shareGroup()`, qui permet de retrouver tous les contextes d’un groupe de partage donné. Un groupe de partage est constitué de tous les contextes qui ont été initialisés avec succès et qui partagent des ressources avec un contexte existant au sein de ce groupe. Un contexte ne participant pas au partage a pour groupe de partage un seul et unique contexte.
Framebuffer par défaut
Sur certaines plateformes, un framebuffer autre que 0 peut être le framebuffer par défaut en fonction de la surface actuelle. Au lieu d’appeler glBindFramebuffer(0), il est recommandé d’utiliser glBindFramebuffer(ctx->defaultFramebufferObject()), afin de garantir la portabilité de votre application entre différentes plateformes. Toutefois, si vous utilisez ` QOpenGLFunctions::glBindFramebuffer()`, cette opération est effectuée automatiquement pour vous.
Avertissement : WebAssembly
Nous recommandons de ne désigner qu’un seul QOpenGLContext comme actif via une QSurface, et ce pendant toute la durée de vie de l’ QSurface. Si plusieurs contextes sont utilisés, il est important de comprendre que plusieurs instances de QOpenGLContext peuvent être sous-jacentes au même contexte natif sur la plateforme WebAssembly. Par conséquent, l’appel à ` makeCurrent()` avec le même ` QSurface ` sur deux objets `QOpenGLContext` peut ne pas basculer vers un contexte natif différent lors du deuxième appel. En conséquence, toute modification de l’état OpenGL effectuée après le deuxième appel à ` makeCurrent()` peut également altérer l’état du premier `QOpenGLContext`, car ils sont tous deux adossés au même contexte natif.
Remarque : cela signifie que lorsque l’on cible WebAssembly avec du code Qt existant basé sur OpenGL, un certain travail de portage peut s’avérer nécessaire pour tenir compte de ces limitations.
Considérations de sécurité
Toutes les données utilisées par `QOpenGLContext` et les classes qui s’appuient sur lui, telles que ` QOpenGLFunctions`, les classes du module ` QtOpenGL ` et ` QRhi ` avec son backend OpenGL, sont censées être du contenu fiable. Cela inclut le code source des shaders, les données de sommets et d’index, les textures et autres données de pixels, ainsi que tous les paramètres transmis aux fonctions OpenGL. Qt ne valide ni ne nettoie aucun de ces éléments.
Notez également que la fonction ` getProcAddress()` renvoie un pointeur de fonction brut résolu par son nom à partir de l’implémentation OpenGL. Qt ne peut pas vérifier que la signature vers laquelle l’appelant le convertit correspond à celle fournie par l’implémentation ; une erreur à ce niveau entraîne un comportement indéfini.
L’implémentation OpenGL, c’est-à-dire le pilote et, sur les plateformes qui en disposent, la bibliothèque qui le fait appel, est une dépendance de plateforme de confiance, intégrée au processus. Qt la charge et l’appelle directement, sans aucun bac à sable ni vérification, de la même manière qu’il traite l’implémentation Vulkan.
Le choix de la bibliothèque à charger est déterminé par l’ordre de recherche habituel des bibliothèques partagées de la plate-forme et, sur certaines plates-formes, par des variables d’environnement. Cette sélection fait partie de la configuration de confiance du déploiement : un déploiement qui ne la contrôle pas ne contrôle pas non plus le code natif qui s’exécute au sein du processus.
Avertissement : il est conseillé aux développeursd’applications d’examiner attentivement les implications potentielles avant d’autoriser l’injection de contenu fourni par l’utilisateur qui ne fait pas partie de l’application et n’est pas sous le contrôle des développeurs.
Voir également 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.
| Constante | Valeur | Description |
|---|---|---|
QOpenGLContext::LibGL | 0 | OpenGL |
QOpenGLContext::LibGLES | 1 | OpenGL ES 2.0 ou version ultérieure |
Documentation des fonctions membres
[explicit] QOpenGLContext::QOpenGLContext(QObject *parent = nullptr)
Crée une nouvelle instance de contexte OpenGL dont l'objet parent est parent.
Avant de pouvoir l'utiliser, vous devez définir le format approprié et appeler la fonction create().
Voir également create() et makeCurrent().
[virtual noexcept] QOpenGLContext::~QOpenGLContext()
Détruit l'objet ` QOpenGLContext `.
S'il s'agit du contexte actuel du thread, la méthode ` doneCurrent()` est également appelée.
[signal] void QOpenGLContext::aboutToBeDestroyed()
Ce signal est émis avant la destruction du contexte OpenGL natif sous-jacent, afin de permettre aux utilisateurs de libérer les ressources OpenGL qui, sans cela, risqueraient de rester en suspens dans le cas de contextes OpenGL partagés.
Si vous souhaitez rendre le contexte actif afin de procéder à ce nettoyage, veillez à ne vous connecter au signal qu’à l’aide d’une connexion directe.
Remarque : dans Qt for Python, ce signal ne sera pas reçu lorsqu’il est émis depuis le destructeur de QOpenGLWidget ou QOpenGLWindow, car l’instance Python est déjà détruite. Nous recommandons d’effectuer 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 de votre système ne prend pas en charge la version demandée du contexte OpenGL, alors ` QOpenGLContext ` tentera de créer la version la plus proche. Les propriétés réelles du contexte créé peuvent être consultées à l’aide de l’ QSurfaceFormat renvoyé par la fonction format(). Par exemple, si vous demandez un contexte prenant en charge le profil Core d’OpenGL 4.3, mais que le pilote et/ou le matériel ne prennent en charge que les contextes du profil Core de la version 3.2, vous obtiendrez alors un contexte du profil Core 3.2.
Renvoie « true » si le contexte natif a été créé avec succès et est prêt à être utilisé avec les fonctions 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 également makeCurrent() et format().
[static] QOpenGLContext *QOpenGLContext::currentContext()
Renvoie le dernier contexte ayant appelé la fonction ` makeCurrent ` dans le thread actuel, ou ` nullptr` si aucun contexte n'est actif.
GLuint QOpenGLContext::defaultFramebufferObject() const
Appelez cette fonction pour obtenir l'objet framebuffer par défaut de la surface actuelle.
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. Par conséquent, au lieu d'appeler glBindFramebuffer(0), vous devriez appeler glBindFramebuffer(ctx->defaultFramebufferObject()) si vous souhaitez que votre application fonctionne sur différentes plateformes Qt.
Si vous utilisez la fonction glBindFramebuffer() de la classe QOpenGLFunctions, vous n’avez pas à vous soucier de cela, car elle lie automatiquement le defaultFramebufferObject() du contexte actuel lorsque la valeur 0 est transmise.
Remarque : les widgets qui s’affichent via des objets framebuffer, tels que ` QOpenGLWidget ` et ` QQuickWidget`, remplaceront la valeur renvoyée par cette fonction lorsque le dessin est actif, car à ce moment-là, le framebuffer « par défaut » correct est le framebuffer de support associé au widget, et non celui spécifique à la plateforme appartenant à 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 pratique permettant d'appeler ` makeCurrent ` avec une surface égale à 0.
Cela a pour conséquence qu'aucun contexte n'est actif dans le thread actuel.
Voir également makeCurrent() et currentContext().
QSet<QByteArray> QOpenGLContext::extensions() const
Renvoie l'ensemble des extensions OpenGL prises en charge par ce contexte.
Le contexte ou un contexte de partage doit être actif.
Voir également hasExtension().
QOpenGLExtraFunctions *QOpenGLContext::extraFunctions() const
Récupérer l'instance « QOpenGLExtraFunctions » pour ce contexte.
QOpenGLContext Cette méthode offre un moyen pratique d'accéder à QOpenGLExtraFunctions sans avoir à le gérer manuellement.
Le contexte ou un contexte de partage doit être actif.
L’instance QOpenGLExtraFunctions renvoyée est prête à l’emploi et ne nécessite pas l’appel de la fonction initializeOpenGLFunctions().
Remarque : QOpenGLExtraFunctions contient des fonctionnalités dont la disponibilité à l’exécution n’est pas garantie. La disponibilité à l’exécution dépend de la plate-forme, du pilote graphique et de la version d’OpenGL demandée par l’application.
Voir également QOpenGLFunctions et QOpenGLExtraFunctions.
QSurfaceFormat QOpenGLContext::format() const
Renvoie le format du contexte de la plateforme sous-jacente, si la fonction ` create()` a été appelée.
Sinon, renvoie le format demandé.
Le format demandé et le format réel peuvent différer. Demander une version OpenGL donnée ne signifie pas que le contexte résultant ciblera exactement la version demandée. Il est uniquement garanti que la combinaison version/profil/options du contexte créé est compatible avec la demande, à condition que le pilote soit capable de fournir un tel contexte.
Par exemple, la demande d’un contexte au profil de base OpenGL version 3.x peut aboutir à un contexte au profil de base OpenGL 4.x. De même, une demande d’OpenGL 2.1 peut aboutir à un contexte OpenGL 3.0 avec des fonctions obsolètes activées. Enfin, selon le pilote, les versions non prises en charge peuvent entraîner soit un échec de la création du contexte, soit la création d’un contexte correspondant à la version la plus élevée prise en charge.
Des différences similaires sont possibles au niveau de la taille des tampons ; par exemple, le contexte obtenu peut disposer d’un tampon de profondeur plus grand que celui demandé. Ceci est tout à fait normal.
Voir également setFormat().
QOpenGLFunctions *QOpenGLContext::functions() const
Récupérer l'instance « QOpenGLFunctions » pour ce contexte.
QOpenGLContext Cette méthode offre un moyen pratique d'accéder à QOpenGLFunctions sans avoir à le gérer manuellement.
Le contexte ou un contexte de partage doit être actif.
L'instance ` QOpenGLFunctions ` renvoyée est prête à l'emploi 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.
Utilisez cette fonction pour accéder aux fonctions d’extension OpenGL ou aux fonctions de base qui ne sont pas nécessairement disponibles sous forme de symboles liés sur toutes les plateformes.
Le pointeur renvoyé peut dépendre de la plateforme. Certains systèmes peuvent renvoyer un pointeur qui n’est pas nullptr, même si la fonction n’est pas valide ou prise en charge.
Pour vérifier de manière fiable la disponibilité d’une fonction, testez la prise en charge de l’extension en appelant ` QOpenGLContext::hasExtension()` (). Pour les fonctions de base, vérifiez la version du contexte actuel via ` version()` dans l’ QSurfaceFormat e renvoyée par ` QOpenGLContext::format()` ().
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, renvoie ` nullptr`.
Cette fonction est utile si vous devez charger des objets OpenGL (tampons, textures, etc.) avant de créer ou d’afficher une surface « QOpenGLWidget » ou une surface « QQuickWidget ».
Avertissement : n’essayez pas de définir le contexte renvoyé par cette fonction comme contexte actif sur une surface. Vous pouvez plutôt créer un nouveau contexte qui partage le contexte global, puis définir ce nouveau contexte comme actif.
Voir également Qt::AA_ShareOpenGLContexts, setShareContext() et makeCurrent().
bool QOpenGLContext::hasExtension(const QByteArray &extension) const
Renvoie « true » si ce contexte OpenGL prend en charge l’ extension OpenGL spécifiée ; sinon, renvoie « false ».
Le contexte ou un contexte de partage doit être actif.
Voir également extensions().
bool QOpenGLContext::isOpenGLES() const
Renvoie « true » si le contexte est un contexte OpenGL ES.
Si le contexte n'a pas encore été créé, le résultat dépend du format demandé via la fonction setFormat().
Voir également create(), format() et setFormat().
bool QOpenGLContext::isValid() const
Renvoie si ce contexte est valide, c'est-à-dire s'il a été créé avec succès.
Sur certaines plateformes, la valeur renvoyée par ` false ` pour un contexte créé précédemment avec succès indique que le contexte OpenGL a été perdu.
La méthode classique pour gérer les scénarios de perte de contexte dans les applications consiste à 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()`, puis 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 activer explicitement. Pour ce faire, activez l’option « ResetNotification » dans ` QSurfaceFormat`. Cela entraînera la définition de ` RESET_NOTIFICATION_STRATEGY_EXT ` sur ` LOSE_CONTEXT_ON_RESET_EXT ` dans le contexte OpenGL natif sous-jacent. ` QOpenGLContext ` surveillera alors l’état via ` glGetGraphicsResetStatusEXT() ` à chaque appel de ` makeCurrent()`.
Voir également create().
bool QOpenGLContext::makeCurrent(QSurface *surface)
Définit le contexte actif dans le thread courant, en fonction de l'surface fournie. Renvoie true en cas de succès ; sinon, renvoie 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, par exemple parce que l'application est en suspension.
Si ` surface ` est ` nullptr `, cela revient à appeler ` doneCurrent()`.
Évitez d’appeler cette fonction depuis un thread différent de celui dans lequel réside l’instance de ` QOpenGLContext `. Si vous souhaitez utiliser ` QOpenGLContext ` depuis un autre thread, vous devez d’abord vous assurer qu’elle n’est pas active dans le thread actuel, en appelant ` doneCurrent()` si nécessaire. Appelez ensuite `moveToThread(otherThread)` avant de l’utiliser dans l’autre thread.
Par défaut, Qt effectue une vérification qui impose la condition ci-dessus concernant l’affinité de thread. Il est toutefois 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 résident, comme expliqué dans la documentation relative à 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 plateforme de ` QOpenGLContext`, telles que définies dans l'espace de noms ` QNativeInterface ` :
Interface native vers un NSOpenGLContext sous macOS | |
Interface native vers un contexte EGL | |
Interface native vers un contexte GLX | |
Interface native vers un contexte WGL sous Windows |
Si l'interface demandée n'est pas disponible, un objet ` nullptr ` est renvoyé.
[static] QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()
Renvoie le type d'implémentation OpenGL sous-jacente.
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.
Remarque : une implémentation OpenGL de bureau peut également être capable de créer des contextes compatibles ES. C'est pourquoi, dans la plupart des cas, il est plus approprié de vérifier QSurfaceFormat::renderableType() ou d'utiliser la fonction de commodité isOpenGLES().
Remarque : 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 l'format e avec laquelle le contexte OpenGL doit être compatible. Vous devez appeler la fonction ` create()` pour que cette configuration prenne effet.
Lorsque le format n’est pas explicitement défini via cette fonction, c’est le format renvoyé par QSurfaceFormat::defaultFormat() qui sera utilisé. Cela signifie que, en cas de contextes multiples, les appels individuels à cette fonction peuvent être remplacés par un seul appel à QSurfaceFormat::setDefaultFormat() avant la création du premier contexte.
Voir également format().
void QOpenGLContext::setScreen(QScreen *screen)
Définit l'screen e pour laquelle le contexte OpenGL doit être valide. Vous devez appeler la fonction ` create()` pour que cette modification prenne effet.
Voir également ` screen()`.
void QOpenGLContext::setShareContext(QOpenGLContext *shareContext)
Permet à ce contexte de partager des textures, des shaders et d'autres ressources OpenGL avec shareContext. Vous devez appeler create() pour que cela prenne effet.
Voir également shareContext().
QOpenGLContext *QOpenGLContext::shareContext() const
Renvoie le contexte de partage utilisé pour créer ce contexte.
Si la plateforme sous-jacente n'a pas pu prendre en charge le partage demandé, cette fonction renvoie 0.
Voir également setShareContext().
QOpenGLContextGroup *QOpenGLContext::shareGroup() const
Renvoie le groupe de partages auquel appartient ce contexte.
[static] bool QOpenGLContext::supportsThreadedOpenGL()
Renvoie « true » si la plateforme prend en charge le rendu OpenGL en dehors du thread principal (GUI).
Cette valeur est gérée par le plugin de la plateforme utilisé et peut également dépendre des pilotes graphiques.
QSurface *QOpenGLContext::surface() const
Renvoie la surface qui a été définie comme surface active dans le contexte.
Il s'agit de la surface transmise en argument à la fonction ` makeCurrent()`.
void QOpenGLContext::swapBuffers(QSurface *surface)
Permutez les tampons avant et arrière de la fonction ` surface`.
Appelez cette fonction pour terminer une image de rendu OpenGL, et veillez à 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.