3. Communication par composant
Les composants Qt Quick peuvent directement être définis par du code QML, comme au
chapitre Créer un composant réutilisable, mais également en Python. Dans le cadre de
BiblioApp, les seuls composants qui auraient à gagner à être implémentés en Python ont
trait à la gestion des données : le module LocalStorage permet un stockage dans une
base de données SQLite, mais nécessite d'écrire des requêtes SQL directement dans le
code QML. En passant cette partie en Python, le code QML ne dépend plus de la
manière de stocker ces données (dans des fichiers, par exemple) : elles pourront être
mémorisées dans des fichiers JSON (en utilisant le module JSON de Python) très
facilement… ou bien dans une base de données complexe, sans que l'application
Qt Quick doive être modifiée pour passer de l'une à l'autre manière de stocker les
informations. L'avantage de JSON, dans ce contexte, est que la traduction des structures
de données Python se fait en une ligne de code et que les fichiers produits sont lisibles
dans à peu près n'importe quel langage de programmation sur n'importe quel ordinateur.
En pratique, l'objectif est donc de créer un modèle PyQt pour lequel chaque opération
est répercutée sur un fichier (dont le nom est précisé par une propriété du modèle). Ce
modèle est équivalent à une liste, puisque les éléments sont simplement listés les uns
après les autres, sans structure particulière si ce n'est leur ordre [24] . L'implémentation
devrait donc être une nouvelle classe (le modèle à créer) qui hérite de
QAbstractListModel [25] . Cependant, cela n'est pas obligatoire : les vues Qt Quick
utilisent une API totalement différente de celles des modèles de PyQt.
En pratique, il faut donc que la classe Python implémente les différentes méthodes des
modèles Qt Quick :
insert(self, row, value) : insère la valeur value à la position row du
modèle ;
append(self, value) : insère la valeur value à la fin du modèle (à la position
row = count()) ;
get(self, row) : récupère la valeur à la position row ;
set(self, row, value) : change la valeur à la position row pour value ;
remove(self, row) : supprime la valeur à la position row ;
385
Les composants Qt Quick peuvent directement être définis par du code QML, comme au
chapitre Créer un composant réutilisable, mais également en Python. Dans le cadre de
BiblioApp, les seuls composants qui auraient à gagner à être implémentés en Python ont
trait à la gestion des données : le module LocalStorage permet un stockage dans une
base de données SQLite, mais nécessite d'écrire des requêtes SQL directement dans le
code QML. En passant cette partie en Python, le code QML ne dépend plus de la
manière de stocker ces données (dans des fichiers, par exemple) : elles pourront être
mémorisées dans des fichiers JSON (en utilisant le module JSON de Python) très
facilement… ou bien dans une base de données complexe, sans que l'application
Qt Quick doive être modifiée pour passer de l'une à l'autre manière de stocker les
informations. L'avantage de JSON, dans ce contexte, est que la traduction des structures
de données Python se fait en une ligne de code et que les fichiers produits sont lisibles
dans à peu près n'importe quel langage de programmation sur n'importe quel ordinateur.
En pratique, l'objectif est donc de créer un modèle PyQt pour lequel chaque opération
est répercutée sur un fichier (dont le nom est précisé par une propriété du modèle). Ce
modèle est équivalent à une liste, puisque les éléments sont simplement listés les uns
après les autres, sans structure particulière si ce n'est leur ordre [24] . L'implémentation
devrait donc être une nouvelle classe (le modèle à créer) qui hérite de
QAbstractListModel [25] . Cependant, cela n'est pas obligatoire : les vues Qt Quick
utilisent une API totalement différente de celles des modèles de PyQt.
En pratique, il faut donc que la classe Python implémente les différentes méthodes des
modèles Qt Quick :
insert(self, row, value) : insère la valeur value à la position row du
modèle ;
append(self, value) : insère la valeur value à la fin du modèle (à la position
row = count()) ;
get(self, row) : récupère la valeur à la position row ;
set(self, row, value) : change la valeur à la position row pour value ;
remove(self, row) : supprime la valeur à la position row ;
385
