+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Responsable Qt


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherches
    Inscrit en
    août 2008
    Messages
    22 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : août 2008
    Messages : 22 140
    Points : 119 117
    Points
    119 117

    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 ou PyQt (tutoriels, FAQ, traductions) ? Contactez-moi par MP.

    Nouveau ! 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 à l'essai
    Profil pro
    Inscrit en
    mars 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2008
    Messages : 33
    Points : 10
    Points
    10

    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