Sur cette page

Combiner Qt avec d'autres bibliothèques d'interfaces utilisateur

Qt fournit un ensemble complet de composants et de contrôles d'interface utilisateur multiplateformes qui couvrent la grande majorité des besoins en matière de développement d'applications. Cependant, il existe des situations où l'intégration de Qt à d'autres kits d'interface utilisateur s'avère nécessaire ou avantageuse.

Un cas de figure consiste à intégrer des interfaces utilisateur Qt dans des applications développées avec d’autres bibliothèques, par exemple lors de la mise en œuvre de plugins pour une application existante, ou lors de l’introduction progressive de Qt dans une base de code existante.

Un autre cas de figure consiste à héberger des éléments d'interface utilisateur natifs ou tiers dans une application Qt, par exemple pour accéder à des contrôles spécialisés que Qt ne fournit pas.

Nous allons maintenant examiner différents aspects de la résolution de ces deux cas d’utilisation.

Fenêtres externes

Pour intégrer Qt à d’autres kits d’interface utilisateur, il faut d’abord disposer d’une représentation commune des éléments de base de l’interface utilisateur pour cette plateforme. Dans Qt, cela est représenté par le type ` WId `, un descripteur opaque, chaque plateforme ayant sa propre définition du type natif auquel il correspond.

PlateformeType WId
macOSNSView*
WindowsHWND
X11xcb_window_t
iOSUIView*
AndroidAfficher
WebAssemblyemscripten::val*

L'étape suivante consiste à encapsuler ce descripteur natif dans un élément avec lequel Qt peut interagir. Nous nous appuyons sur l'abstraction « QWindow » de Qt en créant une représentation « QWindow » du descripteur natif.

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

Une fenêtre créée de cette manière est appelée « fenêtre étrangère » dans Qt, car elle représente un contrôle créé par une boîte à outils d’interface utilisateur étrangère (à Qt).

Remarque : Qt ne prend pas la propriété (exclusive) du descripteur de la fenêtre native lors de la création d’une fenêtre étrangère ; l’application est donc chargée de maintenir la fenêtre native active pendant toute la durée de vie de l’ QWindow étrangère.

Nous pouvons désormais intégrer notre interface utilisateur Qt dans cette fenêtre étrangère, ou héberger la fenêtre étrangère dans notre interface utilisateur Qt.

Intégration de Qt dans d’autres kits d’interface utilisateur

Pour intégrer des interfaces utilisateur Qt dans d’autres kits d’interface utilisateur, nous utilisons la fenêtre externe comme fenêtre parente de notre interface utilisateur.

Intégration Qt Widgets

Pour intégrer une interface utilisateur composée de widgets Qt, nous demandons au widget son window handle, puis nous le rattachons à la fenêtre externe.

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

Intégration Qt Quick

Pour intégrer une interface utilisateur de type « Qt Quick », nous pouvons directement réattribuer la « quick view » à une autre fenêtre.

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

En l’absence de descripteur de fenêtre parent

Dans certains cas, il se peut que nous n’ayons pas accès au descripteur parent natif et qu’on nous demande à la place de générer un descripteur natif qui sera réaffecté à un parent hors de notre contrôle.

Comme une « QWindow » sans parent est normalement une fenêtre de niveau supérieur, nous devons d’abord indiquer explicitement à Qt que la fenêtre va devenir une fenêtre enfant, en ajoutant le drapeau « Qt::SubWindow ».

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

Nous demandons ensuite à l’ QWidget ou à l’ QQuickView son identifiant ( WId), via

QWindow::winId(), puis renvoyons ce descripteur natif pour qu’il soit rattaché à un nouveau parent.

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

Distribution des événements

Qt repose sur la capacité à traiter régulièrement des événements et des temporisateurs ; ainsi, lors de l’intégration d’interfaces utilisateur Qt dans une autre boîte à outils d’interface utilisateur, nous avons toujours besoin d’un QGuiApplication. Une approche courante consiste à créer l’instance de l’application lors de la première construction de l’interface utilisateur Qt, puis à la supprimer lorsque nous savons que celle-ci a été démantelée, par exemple lors du déchargement d’un plugin.

Hébergement d’autres boîtes à outils d’interface utilisateur dans Qt

Pour héberger d’autres kits d’interface utilisateur dans Qt, nous encapsulons la fenêtre externe dans un widget Qt ou dans un conteneur de fenêtre spécifique à Qt Quick.

Hébergement dans Qt Widgets

Pour les applications basées sur la pile d’interface utilisateur d’ Qt Widgets, on crée une représentation QWidget de l’ QWindow, via QWidget::createWindowContainer(), qui peut ensuite être gérée comme n’importe quel autre widget, par exemple dans une mise en page.

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

Hébergement dans Qt Quick

Pour les applications développées à partir de la pile d’interface utilisateur Qt Quick, nous exposons la fenêtre externe au moteur QQmlApplicationEngine, puis utilisons l’élément WindowContainer pour gérer cette fenêtre externe.

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

Consultez l’exemple d’hébergement de fenêtre pour une présentation détaillée de ce cas d’utilisation.

Solutions spécifiques à chaque plateforme

Les primitives de base pour l’intégration et l’hébergement de fenêtres décrites ci-dessus devraient couvrir la plupart des cas, mais Qt fournit également des solutions spécifiques à certaines plateformes lorsqu’une intégration encore plus poussée est nécessaire.

Active Qt module

La prise en charge d’ActiveX et de COM par Qt permet aux développeurs Qt sous Windows d’accéder aux contrôles ActiveX et aux objets COM fournis par n’importe quel serveur ActiveX dans leurs applications Qt, et de rendre leurs applications Qt disponibles en tant que serveurs COM, avec un nombre illimité d’objets et de widgets Qt sous forme d’objets COM et de contrôles ActiveX.

Voir Active Qt pour plus d’informations.

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