VersionMineure, "ComposantQtQuick") :
qmlRegisterType(FileStringListModel,
"FileModel", 1, 0,
"FileStringListModel")
Côté Qt Quick, on peut alors importer ce nouveau module et l'utiliser :
import FileModel 1.0
// …
genreModel: FileStringListModel {
file: "genres.db"
Component.onCompleted: {
if (justCreated) {
for (var i = 0; i < initialGenres.length; ++i) {
genreModel.append(initialGenres[i]);
}
}
}
}
Note > En définissant ainsi la version du composant Qt Quick directement au
moment où il est enregistré, une bibliothèque externe peut proposer plusieurs
versions de ses composants en appelant plusieurs fois qmlRegisterType pour le même
nom de composant Qt Quick : les classes Python associées seront différentes, une
classe par version exposée. Ainsi, une version très récente de la bibliothèque peut
fournir une compatibilité parfaite avec ses versions antérieures : quand le
développeur Qt Quick précise la version à importer du module, l'implémentation
correspondante est choisie — sans risque de changement. Ainsi, si une version
précédente de la bibliothèque présente un défaut, celui-ci sera toujours présent en
important cette version antérieure, même s'il a été corrigé dans une version plus
récente.
Le cas du modèle des livres est plus compliqué. PyQt ne permet pas, à l'heure actuelle,
d'échanger des dictionnaires avec le code Qt Quick (contrairement à Qt, en C++). Une
solution partielle consiste à utiliser des rôles, comme dans un modèle Qt Quick :
chaque rôle correspond à une information à mémoriser sur un livre (titre, auteur, genre,
etc.). La fonction roleNames renvoie une correspondance entre les numéros et les noms
des rôles disponibles dans le modèle (les identifiants sont utilisés comme paramètres
par PyQt, tandis que les noms sont utilisés comme clés dans le dictionnaire
représentant chaque livre) ; ensuite, get peut prendre un troisième argument, qui
correspond au rôle (indiqué par son nom). Cette solution est partielle, car la fonction
d'écriture set ne fonctionne pas avec des rôles (elle tente d'écrire, chaque fois, une
entrée complète du modèle, c'est-à-dire un dictionnaire) : il est donc impossible de
389
qmlRegisterType(FileStringListModel,
"FileModel", 1, 0,
"FileStringListModel")
Côté Qt Quick, on peut alors importer ce nouveau module et l'utiliser :
import FileModel 1.0
// …
genreModel: FileStringListModel {
file: "genres.db"
Component.onCompleted: {
if (justCreated) {
for (var i = 0; i < initialGenres.length; ++i) {
genreModel.append(initialGenres[i]);
}
}
}
}
Note > En définissant ainsi la version du composant Qt Quick directement au
moment où il est enregistré, une bibliothèque externe peut proposer plusieurs
versions de ses composants en appelant plusieurs fois qmlRegisterType pour le même
nom de composant Qt Quick : les classes Python associées seront différentes, une
classe par version exposée. Ainsi, une version très récente de la bibliothèque peut
fournir une compatibilité parfaite avec ses versions antérieures : quand le
développeur Qt Quick précise la version à importer du module, l'implémentation
correspondante est choisie — sans risque de changement. Ainsi, si une version
précédente de la bibliothèque présente un défaut, celui-ci sera toujours présent en
important cette version antérieure, même s'il a été corrigé dans une version plus
récente.
Le cas du modèle des livres est plus compliqué. PyQt ne permet pas, à l'heure actuelle,
d'échanger des dictionnaires avec le code Qt Quick (contrairement à Qt, en C++). Une
solution partielle consiste à utiliser des rôles, comme dans un modèle Qt Quick :
chaque rôle correspond à une information à mémoriser sur un livre (titre, auteur, genre,
etc.). La fonction roleNames renvoie une correspondance entre les numéros et les noms
des rôles disponibles dans le modèle (les identifiants sont utilisés comme paramètres
par PyQt, tandis que les noms sont utilisés comme clés dans le dictionnaire
représentant chaque livre) ; ensuite, get peut prendre un troisième argument, qui
correspond au rôle (indiqué par son nom). Cette solution est partielle, car la fonction
d'écriture set ne fonctionne pas avec des rôles (elle tente d'écrire, chaque fois, une
entrée complète du modèle, c'est-à-dire un dictionnaire) : il est donc impossible de
389
