Intégration d’objets C++ dans QML à l’aide de propriétés de contexte
Avertissement : 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 aviez à l’esprit lors de son écriture. Cela limite la réutilisabilité de votre code, car le contexte peut être différent dans d’autres contextes où il pourrait être utilisé. De plus, cette dépendance n’est pas déclarée. Vous ne précisez j import le contexte ni n'indiquez en quoi consistent vos attentes. Par conséquent, toute personne cherchant à réutiliser votre code aura du mal à déterminer si l'emplacement de réutilisation dispose d'un contexte suffisant pour votre code.
Avertissement : les propriétés de contexte sont invisibles pour tous les outils qui traitent le code QML à l’avance, avant que vous ne le chargiez dans le moteur QML. Les outils Qt Quick Compiler, qmllint et les QML Language Server ne savent rien de vos propriétés de contexte et considéreront tout accès à celles-ci comme un accès non qualifié.
Remarque : les propriétésde contexte peuvent généralement être remplacées soit par des propriétés classiques 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 s’avérer utile d’intégrer directement des données C++ exploitables depuis le code QML. Cela permet, par exemple, d’appeler 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 classe ` QQmlContext ` permet d’injecter des données C++ dans un objet QML. Cette classe expose les données au contexte d’un objet QML afin que celles-ci puissent être référencées directement depuis 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 ` n'existant pas dans la portée actuelle :
// 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 la fonction ` QQmlContext::setContextProperty()` :
QQuickView view;
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();Remarque : comme toutes les expressions évaluées en QML le sont dans un contexte particulier, si ce contexte est modifié, toutes les liaisons de ce contexte seront réévaluées. Les propriétés de contexte doivent donc ê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 soit des valeurs de type ` QVariant `, soit des valeurs de type ` QObject*`. Cela signifie que des objets C++ personnalisés peuvent également être injectés à l’aide de cette approche, et que ces objets peuvent être modifiés et lus directement en QML. Ici, nous modifions l’exemple ci-dessus pour intégrer une instance de ` QObject ` au lieu d’une valeur de type ` QDateTime `, et le code QML appelle une méthode sur l’instance de l’objet :
| C++ | |
| QML | |
(Notez que les valeurs de date/heure renvoyées du C++ vers le QML peuvent être formatées à l’aide de Qt.formatDateTime() et des fonctions associées.)
Si l’élément QML doit recevoir des signaux provenant de la propriété contextuelle, il peut s’y connecter à l’aide du type Connections. Par exemple, si ApplicationData dispose d’un signal nommé dataChanged(), ce signal peut être connecté à l’aide d’un gestionnaire onDataChanged au sein d’un objet Connections:
Text {
text: applicationData.getCurrentDateTime()
Connections {
target: applicationData
onDataChanged: console.log("The application data changed!")
}
}Consultez également la documentation « QQmlContext » 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.