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