Родные интерфейсы
Родные интерфейсы предоставляют доступ к родным или специфичным для платформы API классов, которые они расширяют.
Интерфейсы находятся в пространстве имен QNativeInterface и охватывают такие варианты использования, как доступ к базовым родным дескрипторам, адаптация существующих родных дескрипторов или предоставление специфичных для платформы API.
Пример использования
Доступ к базовым родным дескрипторам
В ситуациях, когда функция родной платформы не экспонируется в Qt, может быть полезно получить доступ к родным дескрипторам, поддерживаемым Qt, и использовать их для вызова родных API вместо этого.
Например, для доступа к базовому NSOpenGLContext объекта QOpenGLContext на macOS через родной интерфейс QNativeInterface::QCocoaGLContext:
using namespace QNativeInterface;
if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>())
[cocoaGLContext->nativeContext() makeCurrentContext]; К родному интерфейсу осуществляется доступ через метод QOpenGLContext::nativeInterface(), который гарантирует, что запрашиваемый интерфейс доступен, и в противном случае возвращает nullptr. Базовый NSOpenGLContext затем доступен через метод nativeContext().
Адаптация существующих родных дескрипторов
Аналогично случаю с встраиванием окон, существуют ситуации, когда родная платформа или другой набор инструментов создали родной дескриптор, который вы хотите передать в Qt — обернув существующий дескриптор вместо создания нового.
Например, для адаптации существующего NSOpenGLContext и использования его для совместного использования ресурсов с контекстом, созданным Qt:
using namespace QNativeInterface; QOpenGLContext *adoptedContext = QCocoaGLContext::fromNativeContext(nsOpenGLContext); anotherContext->setShareContext(adoptedContext);
Адаптированный контекст создается специфичной для платформы функцией-фабрикой в родном интерфейсе QNativeInterface::QCocoaGLContext.
Доступ к API, специфичным для платформы
В некоторых случаях API слишком специфичны для платформы, чтобы быть включенными в кроссплатформенные классы Qt, но все же полезны для включения. Эти API доступны так же, как при доступе к базовым родным дескрипторам, через метод nativeInterface(), или напрямую как статические функции в родном интерфейсе.
Например, для извлечения дескриптора модуля OpenGL в Windows:
using namespace QNativeInterface; HMODULE moduleHandle = QWGLContext::openGLModuleHandle();
Совместимость исходного кода и двоичных файлов
Гарантий совместимости исходного кода и двоичных файлов для API родного интерфейса нет, что означает, что приложение, использующее эти интерфейсы, гарантированно будет работать только с версией Qt, с которой оно было разработано.
Доступные интерфейсы
Список всех доступных интерфейсов см. в пространстве имен QNativeInterface.
QOpenGLContext
Доступ через QOpenGLContext::nativeInterface().
Родной интерфейс к NSOpenGLContext на macOS |
|
Родной интерфейс к контексту EGL |
|
Родной интерфейс к контексту GLX |
|
Родной интерфейс к контексту WGL в Windows |
QOffscreenSurface
Доступ через QOffscreenSurface::nativeInterface().
Родной интерфейс к поверхностям offscreen на Android |
QSGTexture
Доступ через QSGTexture::nativeInterface().
Предоставляет доступ к объектам текстур Direct3D 11 и позволяет их адаптацию. |
|
Предоставляет доступ к объектам текстур Metal и позволяет их адаптацию. |
|
Предоставляет доступ к объектам текстур OpenGL и позволяет их адаптацию. |
|
Предоставляет доступ к объектам изображений Vulkan и позволяет их адаптацию. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/native-interfaces.html