Spec-Zone.ru › Qt

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

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

Spec-Zone.ru

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