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