Родные интерфейсы
Родные интерфейсы предоставляют доступ к родным или платформенно-специфичным 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.1/native-interfaces.html