Plattform-Integration

Die Hauptstärke von Qt als plattformübergreifendes Toolkit für die Anwendungsentwicklung besteht darin, dass der Anwendungscode nicht für jede Zielplattform dupliziert werden muss.

Während Qt viele der typischen Aufgaben beim Schreiben einer Anwendung löst, gibt es immer wieder Eckfälle, die Qt nicht abdecken kann oder bei denen es sinnvoller ist, eine Funktion auf den plattformspezifischen APIs oder einem anderen Toolkit aufzubauen.

Um diese Anwendungsfälle zu unterstützen und gleichzeitig Qt die Möglichkeit zu geben, den Großteil der Anwendungslogik zu übernehmen, bietet Qt eine breite Palette von APIs zur Plattformintegration, von einfachen Typkonvertierungen bis hin zu plattformspezifischen nativen Schnittstellen.

Typkonvertierungen

Viele der grundlegenden Datentypen von Qt, wie QString, QPoint oder QImage, bieten Konvertierungen in und aus den entsprechenden nativen Typen.

Zum Beispiel, um den Benutzernamen des aktuellen Benutzers auf Apple-Plattformen zu erhalten:

NSProcessInfo *processInfo = NSProcessInfo.processInfo;
QString userName = QString::fromNSString(processInfo.userName)

Eine vollständige Liste aller Typkonvertierungen finden Sie in der Übersicht Typkonvertierungen.

Fenster einbetten

Fenster, die von den zugrundeliegenden Plattform-APIs erstellt werden, können sowohl als übergeordnete Container für Qt-Fenster verwendet werden, als auch in Qt-Fenster als Kindfenster eingebettet werden.

Ersteres ist nützlich, wenn die Anwendung hauptsächlich unter Verwendung der nativen Plattform-APIs geschrieben wurde, aber Teile der Anwendung Qt verwenden, z.B. um eine spezielle Benutzeroberfläche zu zeichnen. Um Qt in die Fensterhierarchie der nativen Anwendung einzubetten, verwenden Sie QWindow::winId(), um das native Handle für das Qt-Fenster zu erhalten, und verwenden Sie dann die nativen APIs, um das Fenster in die native Benutzeroberfläche einzubinden.

Letzteres ist nützlich, wenn die native Plattform oder ein anderes Toolkit ein spezialisiertes Steuerelement als natives Fenster bereitstellt. Durch die Verwendung von QWindow::fromWinId(), um das Handle des nativen Fensters in ein QWindow zu verpacken, kann das Fenster dann in der Qt-Fensterhierarchie wie jedes andere QWindow neu geparentet werden. Um dieses QWindow in eine Qt Widget-basierte Benutzeroberfläche einzubinden, verwenden Sie die widgetspezifische Funktion QWidget::createWindowContainer().

Ereignisbehandlung

Die meisten Anwendungsfälle der Ereignisbehandlung in Qt werden durch die plattformübergreifende Ereignisausgabe über QWindow::event() und Freunde oder über QObject::installEventFilter() ausreichend abgedeckt.

In den Fällen, in denen dies nicht ausreicht, bietet Qt Zugriff auf die Zustellung der nativen Ereignisse. Ein globaler Ereignisfilter, der alle nativen Ereignisse empfängt, kann mit QCoreApplication::installNativeEventFilter() installiert werden, während native Ereignisse pro Fenster mit QWindow::nativeEvent() behandelt werden können.

Hinweis: Eingriffe in den nativen Ereignisfluss können Qt in einen inkonsistenten Zustand versetzen. Diese APIs sollten in erster Linie dazu verwendet werden, die bestehende Ereignisbehandlung von Qt zu erweitern, zum Beispiel für Ereignisse, die Qt noch nicht behandelt.

Native Schnittstellen

Plattformspezifische Funktionalität, die nicht durch die oben genannten APIs abgedeckt wird, wird durch den allgemeineren Mechanismus der nativen Schnittstellen in Qt behandelt. Die Schnittstellen ermöglichen den Zugriff auf native oder plattformspezifische APIs der Klassen, die sie erweitern.

Die Schnittstellen befinden sich im Namespace QNativeInterface und decken Anwendungsfälle wie den Zugriff auf zugrunde liegende native Handles, die Übernahme vorhandener nativer Handles oder die Bereitstellung plattformspezifischer APIs ab.

Zum Beispiel, um auf den zugrundeliegenden NSOpenGLContext eines QOpenGLContext auf macOS zuzugreifen, über die native Schnittstelle QNativeInterface::QCocoaGLContext:

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

Eine vollständige Liste aller nativen Schnittstellen finden Sie in der Übersicht der nativen Schnittstellen.

Warnung: Es gibt keine Quellcode- oder Binärkompatibilitätsgarantien für die nativen Schnittstellen-APIs, was bedeutet, dass eine Anwendung, die diese Schnittstellen verwendet, garantiert nur mit der Qt-Version funktioniert, für die sie entwickelt wurde.

Plattform-Unterstützung

Zusätzlich zu den APIs für Anwendungsentwickler bietet Qt auch Schnittstellen zur Plattform, wenn es die zugrunde liegenden Implementierungen der plattformübergreifenden Bausteine in Qt bereitstellt.

Beispiele hierfür sind die Abstraktionen der Event-Dispatcher in Qt Core und die Abstraktionen der Rendering-Hardware in RHI.

Die wichtigste Abstraktionsschicht ist hier die Qt Platform Abstraction, kurz QPA, die sich mit der Integration von Fenstersystemen und verwandten Anwendungsfällen befasst.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.