Интеграция с платформой
Основное преимущество Qt как кроссплатформенного инструментария для разработки приложений заключается в устранении необходимости дублирования кода приложения для каждой целевой платформы.
Хотя Qt решает многие типичные задачи написания приложения, всегда существуют частные случаи, которые Qt не может покрыть, или когда имеет больше смысла разработать функцию поверх платформенно-специфичных API или другого инструментария.
Для поддержки этих случаев, позволяя при этом Qt обрабатывать основную логику приложения, Qt предоставляет широкий спектр API интеграции с платформой, от простых преобразований типов до платформенно-специфичных нативных интерфейсов.
Преобразование типов
Многие базовые типы данных Qt, такие как QString, QPoint или QImage, обеспечивают преобразования к и из соответствующих нативных типов.
Например, чтобы получить имя текущего пользователя на платформах Apple:
NSProcessInfo *processInfo = NSProcessInfo.processInfo; QString userName = QString::fromNSString(processInfo.userName)
Полный список всех преобразований типов см. в обзоре Преобразования типов.
Встраивание окон
Окна, созданные с помощью базовых API платформы, могут использоваться как контейнеры-родители для окон Qt или встраиваться в окна Qt в качестве дочерних окон.
Первый вариант полезен, если приложение в основном написано с использованием нативных API платформы, но при этом части приложения используют Qt, например, для рисования специализированного пользовательского интерфейса. Чтобы встроить Qt в иерархию окон нативного приложения, используйте QWindow::winId() для получения нативного дескриптора окна Qt, а затем используйте нативные API для переопределения родителя окна в нативный пользовательский интерфейс.
Второй вариант полезен, если нативная платформа или другой инструментарий предоставляют специализированное управление в виде нативного окна. Используя QWindow::fromWinId() для обертывания нативного дескриптора окна в QWindow, окно можно переместить в иерархию окон Qt как любое другое QWindow. Для переопределения родителя этого QWindow в пользовательский интерфейс на основе виджетов Qt используйте функцию виджетов QWidget::createWindowContainer().
Обработка событий
Большинство случаев обработки событий в Qt достаточно полно покрываются кроссплатформенной доставкой событий через QWindow::event() и аналогичные методы или через QObject::installEventFilter().
В тех случаях, когда этого недостаточно, Qt предоставляет доступ к доставке нативных событий. Глобальный обработчик событий, который получает все нативные события, можно установить с помощью QCoreApplication::installNativeEventFilter(), а обработка нативных событий по отдельным окнам возможна в QWindow::nativeEvent().
Примечание: Вмешательство в поток нативных событий может привести Qt в несогласованное состояние. Эти API следует использовать в первую очередь для дополнения существующей обработки событий Qt, например, для событий, которых Qt еще не обрабатывает.
Нативные интерфейсы
Платформенно-специфичная функциональность, не покрытая API, упомянутыми выше, обрабатывается более универсальным механизмом нативных интерфейсов в Qt. Интерфейсы обеспечивают доступ к нативным или платформенно-специфичным API классов, которые они расширяют.
Интерфейсы находятся в пространстве имен QNativeInterface и охватывают такие случаи использования, как доступ к базовым нативным дескрипторам, принятие существующих нативных дескрипторов или предоставление платформенно-специфичных API.
Например, для доступа к базовому NSOpenGLContext QOpenGLContext в macOS через нативный интерфейс QNativeInterface::QCocoaGLContext:
using namespace QNativeInterface;
if (auto *cocoaGLContext = glContext->nativeInterface<QCocoaGLContext>())
[cocoaGLContext->nativeContext() makeCurrentContext]; Полный список всех нативных интерфейсов см. в обзоре Нативные интерфейсы.
Предупреждение: Для API нативных интерфейсов не гарантируется совместимость источников или бинарных файлов, что означает, что приложение, использующее эти интерфейсы, гарантированно будет работать только с версией Qt, для которой оно разрабатывалось.
Поддержка платформ
Помимо API для разработчиков приложений, Qt также взаимодействует с платформой при предоставлении базовых реализаций кроссплатформенных строительных блоков в Qt.
Примеры включают абстракции диспетчера событий в Qt Core и абстракции аппаратного ускорения рендеринга в RHI.
Основной уровень абстракции здесь — Qt Platform Abstraction, или QPA вкратце, который обрабатывает интеграцию с системой окон и связанные с этим случаи использования.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/platform-integration.html