Interfaces natives
Les interfaces natives permettent d'accéder aux API natives ou spécifiques à la plate-forme des classes qu'elles étendent.
Les interfaces se trouvent dans l'espace de noms QNativeInterface et couvrent des cas d'utilisation tels que l'accès aux poignées natives sous-jacentes, l'adoption de poignées natives existantes ou la fourniture d'API spécifiques à une plateforme.
Exemple d'utilisation
Accès aux handles natifs sous-jacents
Dans les situations où une fonctionnalité de la plateforme native n'est pas exposée dans Qt Help, il peut être utile d'accéder aux handles natifs maintenus par Qt Help et de les utiliser pour appeler les API natives à la place.
Par exemple, pour accéder au NSOpenGLContext sous-jacent d'un QOpenGLContext sur macOS, via l'interface native QNativeInterface::QCocoaGLContext:
using namespace QNativeInterface; if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>()) [cocoaGLContext->nativeContext() makeCurrentContext];
L'interface native est accessible via l'accesseur QOpenGLContext::nativeInterface(), qui s'assure que l'interface demandée est disponible, et renvoie sinon nullptr. Le NSOpenGLContext sous-jacent est alors accessible via l'accesseur nativeContext().
Adoption de poignées natives existantes
De la même manière que pour l'intégration de fenêtres, il existe des situations où la plateforme native, ou une autre boîte à outils, a créé une poignée native que vous souhaitez transmettre à Qt - en enveloppant la poignée existante au lieu d'en créer une nouvelle.
Par exemple, pour adopter un contexte NSOpenGLC existant et l'utiliser pour partager des ressources avec un contexte créé par Qt :
using namespace QNativeInterface; QOpenGLContext *adoptedContext = QCocoaGLContext::fromNativeContext(nsOpenGLContext); anotherContext->setShareContext(adoptedContext);
Le contexte adopté est créé par une fonction d'usine spécifique à la plate-forme dans l'interface native QNativeInterface::QCocoaGLContext.
Accès aux API spécifiques à une plate-forme
Dans certains cas, une API est trop spécifique à une plate-forme pour être incluse dans les classes Qt multiplateformes, mais il est toujours utile de l'inclure. Ces API sont disponibles soit de la même manière que lors de l'accès aux poignées natives sous-jacentes, via l'accesseur nativeInterface(), soit directement en tant que fonction statique dans l'interface native.
Par exemple, pour extraire la poignée du module OpenGL sous Windows :
using namespace QNativeInterface; HMODULE moduleHandle = QWGLContext::openGLModuleHandle();
Compatibilité source et binaire
Il n'y a pas de garantie de compatibilité source ou binaire pour les API des interfaces natives, ce qui signifie qu'une application utilisant ces interfaces n'est garantie de fonctionner qu'avec la version de Qt avec laquelle elle a été développée.
Interfaces disponibles
Pour une liste de toutes les interfaces disponibles, voir l'espace de noms QNativeInterface.
QOpenGLContext
Accessible via QOpenGLContext::nativeInterface().
Interface native d'un NSOpenGLContext sur macOS | |
Interface native avec un contexte EGL | |
Interface native avec un contexte GLX | |
Interface native avec un contexte WGL sous Windows |
QOffscreenSurface
Accessible via QOffscreenSurface::nativeInterface().
Interface native avec une surface hors écran sur Android |
QSGTexture
Accessible via QSGTexture::nativeInterface().
Permet d'accéder aux objets de texture Direct3D 11 et de les adopter. | |
Permet l'accès et l'adoption d'objets de texture Direct3D 12 | |
Permet d'accéder aux objets de texture Metal et de les adopter. | |
Permet d'accéder aux objets de texture OpenGL et de les adopter | |
Permet d'accéder et d'adopter les objets d'image Vulkan |
© 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.