Spec-Zone.ru › Qt 6.0

Родные интерфейсы

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

QNativeInterface::QCocoaGLContext

Родной интерфейс к NSOpenGLContext на macOS

QNativeInterface::QEGLContext

Родной интерфейс к контексту EGL

QNativeInterface::QGLXContext

Родной интерфейс к контексту GLX

QNativeInterface::QWGLContext

Родной интерфейс к контексту WGL в Windows

QOffscreenSurface

Доступ через QOffscreenSurface::nativeInterface().

QNativeInterface::QAndroidOffscreenSurface

Родной интерфейс к поверхностям offscreen на Android

QSGTexture

Доступ через QSGTexture::nativeInterface().

QNativeInterface::QSGD3D11Texture

Предоставляет доступ к объектам текстур Direct3D 11 и позволяет их адаптацию.

QNativeInterface::QSGMetalTexture

Предоставляет доступ к объектам текстур Metal и позволяет их адаптацию.

QNativeInterface::QSGOpenGLTexture

Предоставляет доступ к объектам текстур OpenGL и позволяет их адаптацию.

QNativeInterface::QSGVulkanTexture

Предоставляет доступ к объектам изображений 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API