Quelques développeurs de Qt commencent donc à explorer l’autre piste : donner accès directement aux composants natifs à travers Qt. L’idée n’est pas neuve (wxWidgets l’implémente, par exemple), mais elle présente toute une série de défis — pas tellement pour les composants les plus simples, mais surtout les plus complexes, comme les onglets — : selon les systèmes, les composants natifs ont plus ou moins de fonctionnalités, une variété difficile à unifier.
Les développements actuels donnent un prototype d’ensemble de composants, avec une architecture à base d’extensions (une par plateforme). L’API (tant C++ que Qt Quick) est très réduite et fonctionne comme une boîte noire : les fonctionnalités exposées doivent être disponibles sur toutes les plateformes actuellement gérées… et celles du futur. Cette restriction signifie que cette solution n’est pas prévue pour ceux qui souhaitent personnaliser leur interface. À terme, l’objectif est de laisser l’utilisateur accéder directement aux composants natifs pour implémenter les fonctionnalités non disponibles lui-même.
Par exemple, voici une petite application Qt Quick qui mélange l’API commune (module Qt.CommonControls — le nom n’est pas définitif) et des composants natifs spécifiques à macOS (AppKit, module Qt.AppKitControls) :
Code qml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import QtQml 2.0 import Qt.CommonControls 1.0 as Common import Qt.AppKitControls 1.0 as AppKit Window { id: window visible: true Common.Button { id: button x: 20 y: 20 text: "Click me" onClicked: text ="You clicked me!" } Common.TextField { id: textField placeholderText: "TextField" x: 20 y: button.bottom + 8 } AppKit.SearchField { placeholderText: "Search" x: 20 y: textField.bottom + 8 } } |
La même en C++ :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QCommonWindow window; QCommonButton commonButton(QStringLiteral("Click me"), &window); commonButton.move(20, 20); QObject::connect(&commonButton, &QCommonButton::clicked, [&commonButton](){ commonButton.setText(QStringLiteral("Clicked!")); }); QCommonTextField textField(&window); textField.setPlaceholderText(QStringLiteral("TextField")); textField.move(20, commonButton.bottom() + 8); #if defined(Q_OS_MACOS) QAppKitSearchField searchField; searchField.setParent(&window); searchField.move(20, textField.bottom() + 8); NSSearchField *nsSearchField = searchField.nsSearchFieldHandle(); nsSearchField.placeholderString = @"Search..."; #endif window.showFullScreen(); return app.exec(); } |
Ces développements ne devraient pas arriver avant Qt 6. En effet, avec Qt 5, on compte déjà un certain nombre de manières de créer des interfaces graphiques :
- Qt Widgets ;
- Qt Quick et ses composants de base (de très bas niveau) ;
- Qt Quick Controls 1 ;
- Qt Quick Controls 2.
La situation est déjà complexe ; ajouter ces composants natifs ne ferait qu’embrouiller largement plus toute personne débutant avec Qt. Les plans sont donc de réduire le nombre d’options : soit Qt Widgets (pour la compatibilité avec les applications existantes), soit Qt Quick Controls 2 (pour l’embarqué et le mobile), soit cette nouvelle voie de composants entièrement natifs (pour les autres besoins).
Source : Native look and feel.