- Qt 6.7
- Platform Integration
- Native Interfaces
- Qt 6.7.3 Reference Documentation

# Native Interfaces

The native interfaces provide access to native or platform specific APIs of the classes they extend.

The interfaces live in the QNativeInterface namespace, and cover use-cases such as accessing underlying native handles, adopting existing native handles, or providing platform specific APIs.

## Example Usage

### Accessing underlying native handles

In situations where a feature of the native platform is not exposed in Qt, it can be helpful to access the native handles maintained by Qt, and use those to call the native APIs instead.

For example, to access the underlying NSOpenGLContext of an QOpenGLContext on macOS, via the QNativeInterface::QCocoaGLContext native interface:

     using namespace QNativeInterface;
     if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>())
         [cocoaGLContext->nativeContext() makeCurrentContext];

The native interface is accessed through the QOpenGLContext::nativeInterface() accessor, which ensures that the requested interface is available, and otherwise returns `nullptr`. The underlying NSOpenGLContext is then accessed through the nativeContext() accessor.

### Adopting existing native handles

Similarly to the window embedding use-case, there are situations where the native platform, or another toolkit, has created a native handle that you would like to pass on to Qt — wrapping the existing handle instead of creating a new one.

For example, to adopt an existing NSOpenGLContext, and use that to share resources with a context created by Qt:

     using namespace QNativeInterface;
     QOpenGLContext *adoptedContext = QCocoaGLContext::fromNativeContext(nsOpenGLContext);
     anotherContext->setShareContext(adoptedContext);

The adopted context is created by a platform specific factory function in the QNativeInterface::QCocoaGLContext native interface.

### Accessing platform specific APIs

In some cases an API is too platform specific to be included in the cross platform Qt classes, but is still useful to include. These APIs are available either in the same way as when accessing the underlying native handles, through the nativeInterface() accessor, or directly as static function in the native interface.

For example, to pull out the OpenGL module handle on Windows:

     using namespace QNativeInterface;
     HMODULE moduleHandle = QWGLContext::openGLModuleHandle();

## Source and Binary Compatibility

There are no source or binary compatibility guarantees for the native interface APIs, meaning that an application using these interfaces is only guaranteed to work with the Qt version it was developed against.

## Available Interfaces

For a list of all available interfaces, see the QNativeInterface namespace.

### QOpenGLContext

Accessed through QOpenGLContext::nativeInterface().

QNativeInterface::QCocoaGLContext | Native interface to an NSOpenGLContext on macOS
QNativeInterface::QEGLContext | Native interface to an EGL context
QNativeInterface::QGLXContext | Native interface to a GLX context
QNativeInterface::QWGLContext | Native interface to a WGL context on Windows

### QOffscreenSurface

Accessed through QOffscreenSurface::nativeInterface().

QNativeInterface::QAndroidOffscreenSurface | Native interface to a offscreen surface on Android

### QSGTexture

Accessed through QSGTexture::nativeInterface().

QNativeInterface::QSGD3D11Texture | Provides access to and enables adopting Direct3D 11 texture objects
QNativeInterface::QSGD3D12Texture | Provides access to and enables adopting Direct3D 12 texture objects
QNativeInterface::QSGMetalTexture | Provides access to and enables adopting Metal texture objects
QNativeInterface::QSGOpenGLTexture | Provides access to and enables adopting OpenGL texture objects
QNativeInterface::QSGVulkanTexture | Provides access to and enables adopting Vulkan image objects