Spec-Zone.ru › Qt 6.1

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

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

Spec-Zone.ru

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