Интеграция с платформой
Основное преимущество 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.1/platform-integration.html