IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut 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 (tutoriels, FAQ, traductions) ou 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é
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 112
    Points : 165
    Points
    165
    Par défaut 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
    Inscrit en
    Juin 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    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

Discussions similaires

  1. Modèle de liste hétérogène en QML
    Par dourouc05 dans le forum Qt Quick
    Réponses: 0
    Dernier message: 02/04/2012, 14h04
  2. Réponses: 4
    Dernier message: 24/09/2010, 00h13
  3. Utilisation de la classe List de STL avec wxWidgets
    Par aoyou dans le forum wxWidgets
    Réponses: 7
    Dernier message: 10/03/2005, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo