Les propriétés ainsi partagées peuvent avoir n'importe quel type Python : des nombres,
des listes… voire des objets, ce qui permet d'accéder à des méthodes Python depuis
Qt Quick. Ces méthodes doivent cependant être définies comme des slots (la classe
doit donc hériter de QObject), sans quoi elles ne pourront pas être reconnues.
Côté Python :
from PyQt5.QtCore import QObject, pyqtSlot
class TextProvider(QObject):
@pyqtSlot(result=str)
def provide(self):
return "Je viens d'une méthode Python."
# …
engine.rootContext().setContextProperty("textProvider",
TextProvider())
Côté QML :
Text { // …
text: textProvider.provide()
}
Grâce à ce mécanisme, les données à charger par défaut dans BiblioApp peuvent être
stockées n'importe où, puis injectées dans l'application Qt Quick. Dans l'exemple, les
données seront stockées au niveau du script lançant l'application, mais cette dernière
peut très bien lire les données par défaut d'un fichier de configuration. Les premiers
genres et livres ne sont donc plus codés en dur dans les fichiers QML.
Ainsi, deux propriétés contextuelles seront définies : initialGenres pour les genres
littéraires et initialBooks pour les livres. Deux types de base de Python sont ainsi
utilisés : d'une part une liste de chaînes de caractères, d'autre part une structure plus
complexe, une liste de dictionnaires. PyQt détecte automatiquement ces types et
s'occupe du nécessaire pour les rendre accessibles côté Qt Quick (pas besoin de
définir de classe héritant de QObject ou de slot, notamment).
Note > Le code source de cet exemple et les fichiers d'éléments associés sont
disponibles dans le projet biblioapp-contexte .
initialGenres = ["(None)", "Biography"…]
383
des listes… voire des objets, ce qui permet d'accéder à des méthodes Python depuis
Qt Quick. Ces méthodes doivent cependant être définies comme des slots (la classe
doit donc hériter de QObject), sans quoi elles ne pourront pas être reconnues.
Côté Python :
from PyQt5.QtCore import QObject, pyqtSlot
class TextProvider(QObject):
@pyqtSlot(result=str)
def provide(self):
return "Je viens d'une méthode Python."
# …
engine.rootContext().setContextProperty("textProvider",
TextProvider())
Côté QML :
Text { // …
text: textProvider.provide()
}
Grâce à ce mécanisme, les données à charger par défaut dans BiblioApp peuvent être
stockées n'importe où, puis injectées dans l'application Qt Quick. Dans l'exemple, les
données seront stockées au niveau du script lançant l'application, mais cette dernière
peut très bien lire les données par défaut d'un fichier de configuration. Les premiers
genres et livres ne sont donc plus codés en dur dans les fichiers QML.
Ainsi, deux propriétés contextuelles seront définies : initialGenres pour les genres
littéraires et initialBooks pour les livres. Deux types de base de Python sont ainsi
utilisés : d'une part une liste de chaînes de caractères, d'autre part une structure plus
complexe, une liste de dictionnaires. PyQt détecte automatiquement ces types et
s'occupe du nécessaire pour les rendre accessibles côté Qt Quick (pas besoin de
définir de classe héritant de QObject ou de slot, notamment).
Note > Le code source de cet exemple et les fichiers d'éléments associés sont
disponibles dans le projet biblioapp-contexte .
initialGenres = ["(None)", "Biography"…]
383
