Auf dieser Seite

Kombination von Qt mit anderen UI-Toolkits

Qt bietet einen umfassenden Satz plattformübergreifender UI-Komponenten und Steuerelemente, die den Großteil der Anforderungen bei der Anwendungsentwicklung abdecken. Es gibt jedoch Situationen, in denen die Integration von Qt mit anderen UI-Toolkits notwendig oder vorteilhaft ist.

Ein Szenario ist die Einbettung von Qt-Benutzeroberflächen in Anwendungen, die mit anderen Toolkits erstellt wurden, beispielsweise bei der Implementierung von Plugins für eine bestehende Anwendung oder bei der schrittweisen Einführung von Qt in eine bestehende Codebasis.

Ein weiteres Szenario ist das Einbinden nativer oder von Drittanbietern stammender UI-Elemente in eine Qt-Anwendung, beispielsweise um auf spezielle Steuerelemente zuzugreifen, die Qt nicht bereitstellt.

Wir betrachten nun verschiedene Aspekte zur Lösung dieser beiden Anwendungsfälle.

Fremde Fenster

Um Qt in andere UI-Toolkits zu integrieren, benötigen wir zunächst eine gemeinsame Darstellung der grundlegenden UI-Bausteine für die jeweilige Plattform. In Qt wird dies durch den Typ „ WId “ dargestellt, ein undurchsichtiges Handle, wobei jede Plattform ihre eigene Definition hat, welchem nativen Typ dieser zugeordnet ist.

PlattformWId-Typ
macOSNSView*
WindowsHWND
X11xcb_window_t
iOSUIView*
AndroidAnzeigen
WebAssemblyemscripten::val*

Der nächste Schritt besteht darin, diesen nativen Handle in etwas zu verpacken, mit dem Qt interagieren kann. Wir bauen auf der Abstraktion „ QWindow “ in Qt auf, indem wir eine „ QWindow “-Darstellung des nativen Handles erstellen.

QWindow *foreignWindow = QWindow::fromWinId(WId(nativeHandle));

Ein auf diese Weise erstelltes Fenster wird in Qt als „fremdes Fenster“ bezeichnet, da es ein Steuerelement darstellt, das von einem (für Qt) fremden UI-Toolkit erstellt wurde.

Hinweis: Qt übernimmt beim Erstellen eines fremden Fensters nicht die (exklusive) Kontrolle über das native Fenster-Handle, sodass die Anwendung dafür verantwortlich ist, das native Fenster für die gesamte Lebensdauer des fremden „ QWindow “ am Leben zu erhalten.

Wir können nun unsere Qt-Benutzeroberfläche in dieses fremde Fenster einbetten oder das fremde Fenster in unserer Qt-Benutzeroberfläche hosten.

Einbettung von Qt in andere UI-Toolkits

Um Qt-UI-Oberflächen in andere UI-Toolkits einzubetten, verwenden wir das fremde Fenster als übergeordnetes Fenster unserer UI-Oberfläche.

Einbetten Qt Widgets

Um eine Qt-Widget-Benutzeroberfläche einzubetten, fragen wir das Widget nach seinem ` window handle` ab und weisen diesem dann das fremde Fenster als übergeordnetes Fenster zu.

QMainWindow *mainWindow = new QMainWindow;
mainWindow->windowHandle()->setParent(foreignWindow);

Einbettung Qt Quick

Um eine „ Qt Quick “-Benutzeroberfläche einzubetten, können wir die „Quick View“ direkt einem anderen übergeordneten Fenster zuordnen.

QQuickView *quickView = new QQuickView;
quickView->setParent(foreignWindow);

Wenn kein übergeordnetes Handle vorhanden ist

In manchen Fällen haben wir möglicherweise keinen Zugriff auf das native übergeordnete Handle und werden stattdessen aufgefordert, ein natives Handle zu erzeugen, das außerhalb unserer Kontrolle neu zugeordnet wird.

Da ein „ QWindow “ ohne übergeordnetes Fenster normalerweise ein Fenster der obersten Ebene ist, müssen wir Qt zunächst explizit mitteilen, dass das Fenster ein untergeordnetes Fenster sein soll, indem wir das Flag „ Qt::SubWindow “ hinzufügen.

quickView->setFlags(quickView->flags() | Qt::SubWindow);

WIdAnschließend fragen wir das „ QWidget “ oder „ QQuickView “ über

QWindow::winId() und geben dieses native Handle anschließend zurück, damit die Zuordnung geändert werden kann.

return reinterpret_cast<NSView*>(quickView->winId());

Ereignisverteilung

Qt ist darauf angewiesen, Ereignisse und Timer regelmäßig verarbeiten zu können; daher benötigen wir auch bei der Integration von Qt-Benutzeroberflächen in ein anderes UI-Toolkit weiterhin ein ` QGuiApplication`. Ein typisches Muster besteht darin, die Anwendungsinstanz beim ersten Aufbau der Qt-Benutzeroberfläche zu erstellen und sie anschließend zu löschen, sobald wir wissen, dass die Qt-Benutzeroberfläche abgebaut wurde, beispielsweise beim Entladen eines Plugins.

Einbindung anderer UI-Toolkits in Qt

Um andere UI-Toolkits in Qt zu hosten, verpacken wir das fremde Fenster in einen Qt Widget- oder „ Qt Quick “-spezifischen Fenstercontainer.

Einbindung in Qt Widgets

Bei Anwendungen, die auf dem Qt Widgets -UI-Stack basieren, erstellen wir über ` QWidget::createWindowContainer()` eine ` QWidget `-Darstellung des ` QWindow`, die dann wie jedes andere Widget verwaltet werden kann, beispielsweise in einem Layout.

QWidget *hostedWidget = QWidget::createWindowContainer(foreignWindow);
layout->addWidget(hostedWidget);

Einbindung in Qt Quick

Bei Anwendungen, die auf dem UI-Stack von Qt Quick basieren, stellen wir das fremde Fenster der QQmlApplicationEngine zur Verfügung und verwenden anschließend das Element „ WindowContainer “, um das fremde Fenster zu verwalten.

engine.setInitialProperties({{ "foreignWindow", QVariant::fromValue(foreignWindow) }});
ApplicationWindow {
    required property QtObject foreignWindow;
    WindowContainer {
        window: foreignWindow
        anchors.centerIn: parent
    }
}

Ein detaillierter Überblick über diesen Anwendungsfall findet sich im Beispiel zum Hosting von Fenstern.

Plattformspezifische Lösungen

Die oben beschriebenen grundlegenden Elemente für die Einbettung und das Hosting von Fenstern sollten die meisten Fälle abdecken, doch Qt bietet auch plattformspezifische Lösungen für Fälle, in denen eine noch tiefere Integration erforderlich ist.

Active Qt Modul

Die ActiveX- und COM-Unterstützung von Qt ermöglicht es Qt-Entwicklern für Windows, in ihren Qt-Anwendungen auf ActiveX-Steuerelemente und COM-Objekte zuzugreifen, die von einem beliebigen ActiveX-Server bereitgestellt werden, und ihre Qt-Anwendungen als COM-Server zur Verfügung zu stellen, wobei eine beliebige Anzahl von Qt-Objekten und Widgets als COM-Objekte und ActiveX-Steuerelemente genutzt werden kann.

Weitere Active Qt für weitere Informationen.

© 2026 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.