Intégrer des objets C++ dans QML avec des propriétés de contexte
Attention : En utilisant des propriétés de contexte dans votre code QML, vous créez une dépendance entre votre code QML et le contexte spécifique que vous avez en tête lorsque vous l'écrivez. Cela limite la réutilisation de votre code puisque le contexte peut être différent dans d'autres endroits où il pourrait être utilisé. En outre, la dépendance n'est pas déclarée. Vous n'avez jamais import le contexte ou indiqué ce que vous attendez. Par conséquent, toute personne essayant de réutiliser votre code aura des difficultés à savoir si le lieu de réutilisation dispose d'un contexte suffisant pour votre code.
Attention : Les propriétés de contexte sont invisibles pour tout outil qui traite le code QML à l'avance, avant que vous ne le chargiez dans le moteur QML. Le compilateurQt Quick , qmllint, et le moteur QML QML Language Server ne savent rien de vos propriétés de contexte et considéreront tout accès aux propriétés de contexte comme un accès non qualifié.
Remarque : les propriétés de contexte peuvent généralement être remplacées soit par des propriétés ordinaires sur l'objet racine d'un composant, soit par des singletons définis soit en C++ à l'aide de QML_SINGLETON, soit en QML à l'aide de pragma Singleton.
Lors du chargement d'un objet QML dans une application C++, il peut être utile d'incorporer directement certaines données C++ qui peuvent être utilisées à partir du code QML. Cela permet, par exemple, d'invoquer une méthode C++ sur l'objet intégré ou d'utiliser une instance d'objet C++ comme modèle de données pour une vue QML.
La possibilité d'injecter des données C++ dans un objet QML est rendue possible par la classe QQmlContext. Cette classe expose les données au contexte d'un objet QML, de sorte que les données peuvent être référencées directement à partir de la portée du code QML.
Définition d'une propriété de contexte simple
Par exemple, voici un élément QML qui fait référence à une valeur currentDateTime qui n'existe pas dans le champ d'application actuel :
// MyItem.qml import QtQuick Text { text: currentDateTime }
Cette valeur currentDateTime peut être définie directement par l'application C++ qui charge le composant QML, à l'aide de QQmlContext::setContextProperty() :
QQuickView view; view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime()); view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show();
Note : Comme toutes les expressions évaluées en QML le sont dans un contexte particulier, si le contexte est modifié, toutes les liaisons dans ce contexte seront réévaluées. Par conséquent, les propriétés de contexte doivent être utilisées avec précaution en dehors de l'initialisation de l'application, car cela peut entraîner une baisse des performances de l'application.
Définition d'un objet en tant que propriété de contexte
Les propriétés de contexte peuvent contenir des valeurs QVariant ou QObject*. Cela signifie que des objets C++ personnalisés peuvent également être injectés en utilisant cette approche, et que ces objets peuvent être modifiés et lus directement dans QML. Ici, nous modifions l'exemple ci-dessus pour intégrer une instance QObject au lieu d'une valeur QDateTime, et le code QML invoque une méthode sur l'instance de l'objet :
| C++ | class ApplicationData : public QObject { Q_OBJECT public: Q_INVOKABLE QDateTime getCurrentDateTime() const { return QDateTime::currentDateTime(); } }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView view; ApplicationData data; view.rootContext()->setContextProperty("applicationData", &data); view.setSource(QUrl::fromLocalFile("MyItem.qml")); view.show(); return app.exec(); } |
| QML | // MyItem.qml import QtQuick Text { text: applicationData.getCurrentDateTime() } |
(Notez que les valeurs de date et d'heure renvoyées de C++ vers QML peuvent être formatées via Qt.formatDateTime() et les fonctions associées).
Si l'élément QML doit recevoir des signaux de la propriété de contexte, il peut s'y connecter en utilisant le type Connections. Par exemple, si ApplicationData a un signal nommé dataChanged(), ce signal peut être connecté à l'aide d'un gestionnaire onDataChanged dans un objet Connections:
Text { text: applicationData.getCurrentDateTime() Connections { target: applicationData onDataChanged: console.log("The application data changed!") } }
Les propriétés de contexte peuvent être utiles pour utiliser des modèles de données basés sur C++ dans une vue QML. Voir les exemples suivants :
démontrant l'utilisation des modèles basés sur QStringList, QList<QObject*> et QAbstractItemModel dans les vues QML.
Pour plus d'informations, consultez également la documentation de QQmlContext.
© 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.