en sus, la propriété count compte le nombre de lignes du modèle (tout changement
doit être notifié par le signal countChanged).
Toutes ces méthodes doivent être accessibles depuis Qt Quick. Le plus simple, pour ce
faire, est de les définir comme slots ; count aura un rôle particulier, puisqu'il s'agit
d'une propriété, non d'une fonction.
Note > Les composants écrits de la sorte, en Python, peuvent également avoir un
rendu graphique, contrairement au modèle que l'on souhaite développer. Pour ce
faire, la classe correspondante doit hériter de QQuickItem, ce qui leur permet de
dessiner leur apparence en faisant appel au graphe de scène Qt Quick (à l'intérieur
de la fonction paint) ou directement à du code OpenGL (il faut alors hériter de
QQuickFrameBufferObject et implémenter la méthode createRenderer).
Pour BiblioApp, deux modèles seront requis, au vu des différences dans la structure
des données à conserver : l'un pour gérer les genres (une simple liste de chaînes de
caractères), l'autre pour les livres proprement dits (un tableau à deux entrées : un livre
correspond à une ligne, chaque colonne à une information mémorisée sur ce livre).
Chacun de ces modèles exposera, en plus de ses données, un champ file pour
mémoriser l'emplacement du fichier JSON où les données seront recopiées. À chaque
modification d'un des deux modèles, le fichier correspondant sera mis à jour ; au
lancement de l'application, le fichier correspondant sera lu pour remplir le modèle.
Le code utilisant ces modèles aura besoin d'un champ justCreated, qui indique si le
fichier de stockage des données vient d'être créé : quand l'application est lancée pour
la première fois, le modèle est vide (les fichiers de stockage n'existent pas), c'est le
moment pour charger des données d'exemple. Cette opération est effectuée seulement
dans le cas où justCreated prend la valeur booléenne vraie (sinon, la base de
données a déjà été créée).
La partie intéressante du modèle des genres, implémenté dans la classe
FileStringListModel, est relativement courte. Chaque méthode de l'interface de
modèle Qt Quick est implémentée (à l'exception de set : puisque les genres ne
changent pas, la seule opération requise est l'ajout à la fin du modèle en chargeant les
données initiales). Le code de l'opération insert() utilise l'API des modèles de PyQt,
c'est-à-dire les fonctions insertRows() pour donner un nombre de lignes à ajouter
dans le modèle et setData() pour modifier des valeurs. Les modifications sont
directement reportées dans le fichier de stockage. La propriété justCreated indique si
ce fichier existait à l'instanciation du modèle.
Note > Le code source de cet exemple et les fichiers d'éléments associés sont
386
doit être notifié par le signal countChanged).
Toutes ces méthodes doivent être accessibles depuis Qt Quick. Le plus simple, pour ce
faire, est de les définir comme slots ; count aura un rôle particulier, puisqu'il s'agit
d'une propriété, non d'une fonction.
Note > Les composants écrits de la sorte, en Python, peuvent également avoir un
rendu graphique, contrairement au modèle que l'on souhaite développer. Pour ce
faire, la classe correspondante doit hériter de QQuickItem, ce qui leur permet de
dessiner leur apparence en faisant appel au graphe de scène Qt Quick (à l'intérieur
de la fonction paint) ou directement à du code OpenGL (il faut alors hériter de
QQuickFrameBufferObject et implémenter la méthode createRenderer).
Pour BiblioApp, deux modèles seront requis, au vu des différences dans la structure
des données à conserver : l'un pour gérer les genres (une simple liste de chaînes de
caractères), l'autre pour les livres proprement dits (un tableau à deux entrées : un livre
correspond à une ligne, chaque colonne à une information mémorisée sur ce livre).
Chacun de ces modèles exposera, en plus de ses données, un champ file pour
mémoriser l'emplacement du fichier JSON où les données seront recopiées. À chaque
modification d'un des deux modèles, le fichier correspondant sera mis à jour ; au
lancement de l'application, le fichier correspondant sera lu pour remplir le modèle.
Le code utilisant ces modèles aura besoin d'un champ justCreated, qui indique si le
fichier de stockage des données vient d'être créé : quand l'application est lancée pour
la première fois, le modèle est vide (les fichiers de stockage n'existent pas), c'est le
moment pour charger des données d'exemple. Cette opération est effectuée seulement
dans le cas où justCreated prend la valeur booléenne vraie (sinon, la base de
données a déjà été créée).
La partie intéressante du modèle des genres, implémenté dans la classe
FileStringListModel, est relativement courte. Chaque méthode de l'interface de
modèle Qt Quick est implémentée (à l'exception de set : puisque les genres ne
changent pas, la seule opération requise est l'ajout à la fin du modèle en chargeant les
données initiales). Le code de l'opération insert() utilise l'API des modèles de PyQt,
c'est-à-dire les fonctions insertRows() pour donner un nombre de lignes à ajouter
dans le modèle et setData() pour modifier des valeurs. Les modifications sont
directement reportées dans le fichier de stockage. La propriété justCreated indique si
ce fichier existait à l'instanciation du modèle.
Note > Le code source de cet exemple et les fichiers d'éléments associés sont
386
