Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Quick Discussion :

Utiliser un modèle de liste C++ en QML


Sujet :

Qt Quick

  1. #1
    Responsable Qt & Livres

    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
    Vous souhaitez participer aux rubriques Qt ou PyQt (tutoriels, FAQ, traductions), HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  2. #2
    Membre habitué
    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 C++ :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    QHash<int, QByteArray> roleNames() const;
    ...


    listmodel.cpp:
    Code C++ :Sélectionner tout -Visualiser dans une fenêtre à part
    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.

  3. #3
    Futur Membre du Club
    Super article qui m'a été très utile !
    Je n'en suis pas sûr mais je pense que la méthode ListModel::clear() devrait être implémentée comme ça:
    Code C++ :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void ListModel::clear()
    {
      beginResetModel();
      qDeleteAll(m_list);
      m_list.clear();
      endResetModel();
    }


    Sans ce beginResetModel() & endResetModel() ma ListView QML ne se vidait pas quand j'appelais ListModel::clear