Utiliser un modèle de liste C++ en QML
La plupart des exemples QML actuels sont exclusivement écrits en QML et JavaScript, probablement pour les garder simples. Cependant, dans une application réelle, pour des raisons de performances, il est recommandé d'écrire autant de code que possible en C++ et de n'utiliser QML que pour l'interface utilisateur. Au final, il est important de savoir comment utiliser un modèle C++ en QML.
QML ne fournit de support direct que pour les modèles de liste pour le moment (comme QAbstractListModel, à cause des vues actuellement supportées (ListView, GridView...).
Le but de cet article est de montrer une manière facile d'utiliser un modèle de liste en C++ en QML au lieu d'un modèle QML comme ListModel.
Utiliser un modèle de liste C++ en QML
Plus tout à fait compatible Qt5
Waouh, super cet artcile!
Je débute en C++ et avec Qt, et toutes les explications que j'ai lu à droite à gauche (y compris dans le dernier bouquin "Créer des application avec Qt 5") sur les différents moyens de faire interagir C++ avec QML me laissaient sur ma faim jusqu'à présent. Ça ne répondait aux besoin de mon projet.
Mais avec cette approche, le concept modèle/vue prend maintenant tout son sens, avec les données codés en C++ par les développeurs d'un côté, et la vue écrite en QML par les designers de l'autres (rapport à l'intro du bouquin...)
Par contre tout ceci n'est plus complètement fonctionnel avec Qt 5. La méthode setRoleNames étant devenue obsolète:
https://codereview.qt-project.org/#change,46890
http://qt-project.org/doc/qt-5.0/qtc...el-compat.html
Du coup, voici les modifications que j'ai dû apporter chez moi:
-le corps de mon constructeur est maintenant vide (suppression de l'appel "setRoleNames(m_prototype->roleNames());").
-ajout de la méthode roleNames:
listmodel.h:
Code:
1 2 3 4
|
...
QHash<int, QByteArray> roleNames() const;
... |
listmodel.cpp:
Code:
1 2 3 4 5 6 7
|
...
QHash<int, QByteArray> ListModel::roleNames() const
{
return m_prototype->roleNames();
}
... |
-il y avait aussi un soucis avec la méthode find(), déclarée non-const d'un côté et définie const de l'autre. Je suis pas sûr, comme je pense avoir besoin de modifier mes données, à priori j'ai viré le const côté cpp.
Je ne l'ai pas encore utilisé dans une vue, mais déjà mon projet compile, c'est déjà ça.
Ce serait pas mal de mettre à jour cet article, ou bien de mettre un petit avertissement dans le bandeau, par rapport à Qt 5.
En tout cas merci pour la présentation de cette approche.