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 Discussion :

QAbstractItemModel et QListView


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut QAbstractItemModel et QListView
    Bonjour,
    Je suis entrain de réaliser une application chargée de récuperer un des données dans un ou plusieurs fichiers XML, permet de mapper ces noms à des noms plus conformes, afin que ceux ci génère un script sql pour alimenter les tables d'une base de données.

    Pour le moment j'arrive à parser mes fichierx XML.
    J'aimerai à présent pouvoir remplir un modele pour pouvoir ensuite le lier à une vue QListView.

    Voici l'architechture de mon application:
    obets metier:
    Machine, Application

    Modeles:
    MachineModel, ApplicationModel

    Code de ApplicationModel.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class ApplicationModel : public QAbstractItemModel
    {
      Q_OBJECT
    private:
      QList<Application> applist_;
     
    public:
      inline ApplicationModel() : QAbstractItemModel() {};
      virtual ~ApplicationModel();
     
      inline virtual int columnCount( const QModelIndex & parent = QModelIndex() ) const { return 3; };
     
      virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
     
      virtual QModelIndex index ( int row, int column, const QModelIndex & parent = QModelIndex() ) const;
     
      inline virtual int rowCount( const QModelIndex & parent = QModelIndex() ) const { return applist_.size(); };
     
      virtual QModelIndex parent(const QModelIndex &child) const;
     
      void append(Application application);
     
      bool contains(Application application);
    };
    Code de ApplicationModel.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include "ApplicationModel.h"
     
    QVariant ApplicationModel::data( const QModelIndex & index, int role) const
    {
      switch (index.column())
      {
      case 0:
        return applist_.at(index.row()).getNom() + " " + applist_.at(index.row()).getVersion();
      case 1:
        return applist_.at(index.row()).getNom();
      case 2:
        return applist_.at(index.row()).getVersion();
      default:
        return QVariant();
      }
    }
     
    QModelIndex ApplicationModel::index ( int row, int column, const QModelIndex & parent) const
    {
      return createIndex(row, column);
    }
     
    QModelIndex ApplicationModel::parent(const QModelIndex &child) const
    {
      return createIndex(0, 0);
    }
     
    ApplicationModel::~ApplicationModel()
    {}
     
    void ApplicationModel::append(Application application)
    {
      int row = rowCount();
      beginInsertRows(QModelIndex(), row, row);
      applist_.append(application);
      endInsertRows();
    }
     
    bool ApplicationModel::contains(Application application)
    {
      return applist_.contains(application);
    }
    Je n'ai pas encore implémenté toutes les fonctions de QAbstraceModelView.

    Lorsque je lie ce ApplicationModel à la QListView, celle-ci ne se remplir pas, et j'avoue ne pas saisir pourquoi, malgrès mes lectures et relectures de la documentation de Qt, est-ce que qu'elqu'un peut m'aider? je me sens un peu perdu.
    En suite j'aurai une question en ce qui concerne les QVariant que retourne la methode data(): Est-ce que un QVariant peut contenir mes objets Metier (cela me simplifierait grandement la tâche)?
    Enfin, Ai-je bien fait d'architechturer mon application de cette manière y'a-t'il un meilleur moyen que de définir des objets metier?

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour d'aprés la doc de Qt4.3,
    If you need a model to use with a QListView or a QTableView, you should consider subclassing QAbstractListModel or QAbstractTableModel instead of this class.
    Essaie plustôt d'hériter de QAbstractListModel

  3. #3
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    Je me suis orienté dans cette direction apres réflexion.
    Parr contre j'aimerai savoir si lorsque je surcharge l'opérateur:
    operator QString() const de la classe application, est-ce que ça la rend convertible en QString si l'une de ses instances est affecté à un QVariant?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Floréal Voir le message
    Je me suis orienté dans cette direction apres réflexion.
    Parr contre j'aimerai savoir si lorsque je surcharge l'opérateur:
    operator QString() const de la classe application, est-ce que ça la rend convertible en QString si l'une de ses instances est affecté à un QVariant?
    operator QString() et une fonction de cast vers une QString. Je dirai donc que oui. Lais j'ai pas trop compris ce que tu demande...

  5. #5
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    J'essaye simplement de d'afficher une liste d'objets (Machines, et Applications), au moyen d'un modèle et d'une vue.
    Comme les Modeles de QT retournent des variants, il faudrait pouvoir les afficher d'une manière ou d'une autre dans une QListeView, et poru cela, j'ai supposé que le meilleur moyen etait de de rendre mes objets convertibles en QString.

    Ah oui, voici le nouveau code de mon Modele:
    ApplicationModel.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #ifndef APLICATIONMODEL_H_INCLUDED
    #define APLICATIONMODEL_H_INCLUDED
     
    #include <QAbstractListModel>
    #include <QList>
    #include "../metier.h"
     
    class ApplicationModel : public QAbstractListModel
    {
      Q_OBJECT
    private:
      QList<Application> applist_;
     
    public:
      ApplicationModel(QObject* parent = 0);
      ApplicationModel(const QList<Application>& appList_, QObject* parent = 0);
      virtual QVariant data (const QModelIndex & index, int role) const;
      virtual Qt::ItemFlags flags ( const QModelIndex & index ) const;
      virtual bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() );
      virtual bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() );
      virtual int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
      virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
      void setApplicationList ( const QStringList & strings );
      QList<Application> applicationList () const;
    };
     
    #endif // APLICATIONMODEL_H_INCLUDED
    ApplicationModel.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include "ApplicationModel.h"
     
    ApplicationModel::ApplicationModel(QObject* parent) : QAbstractListModel(parent)
    {}
     
    ApplicationModel::ApplicationModel(const QList<Application>& applicationList, QObject* parent) :
    QAbstractListModel(parent),
    applist_(applicationList)
    {}
     
    QVariant ApplicationModel::data(const QModelIndex& index, int role) const
    {
      int row = index.row();
      if ((index.column() == 0) && (row >= 0) && (row < rowCount()))
      {
        return QVariant(QVariant::UserType, &applist_[row]);
      }
      return (QVariant::Invalid);
    }
     
    Qt::ItemFlags ApplicationModel::flags(const QModelIndex& index) const
    {
      int row = index.row();
      if ((index.column() == 0) && (row >= 0) && (row < rowCount()))
      {
        return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;
      }
      return 0;
    }
     
    bool ApplicationModel::insertRows(int row, int count, const QModelIndex& parent)
    {
      if (parent != QModelIndex()) return false;
      beginInsertRows(parent, row, row + count - 1);
      for (int i = row; i < row + count; ++i)
      {
        applist_.insert(i, Application());
      }
      endInsertRows();
      return true;
    }
     
    bool ApplicationModel::removeRows(int row, int count, const QModelIndex& parent)
    {
      if (parent != QModelIndex()) return false;
      if (!(row < rowCount() && row + count <= rowCount())) return false;
      beginRemoveRows(parent, row, row + count - 1);
      for (int i = 0; i < count; ++i)
      {
        applist_.removeAt(row);
      }
      endRemoveRows();
      return true;
    }
     
    int ApplicationModel::rowCount(const QModelIndex& parent) const
    {
      if (parent != QModelIndex()) return 0;
      return applist_.size();
    }
     
    bool ApplicationModel::setData(const QModelIndex& index, const QVariant& value, int role)
    {
      if (!value.canConvert<Application>()) return false;
      int row = index.row();
      if (!((index.column() == 0) && (row >= 0) && (row < rowCount()))) return false;
      applist_[row] = value.value<Application>();
      return true;
    }
     
    QList<Application> ApplicationModel::applicationList() const
    {
      return applist_;
    }
    Je me suis inspiré de la classe QStringListModel, pour son interface du moins.

    Voici le résultat que j'obtiens à la compilation:
    C:\Qt\4.3.0\include\QtCore\..\..\src\corelib\kernel\qmetatype.h:178: instantiated from `int qMetaTypeId(T*) [with T = Application]'
    C:\Qt\4.3.0\include\QtCore\..\..\src\corelib\kernel\qvariant.h:561: instantiated from `bool qVariantCanConvert(const QVariant&) [with T = Application]'
    C:\Qt\4.3.0\include\QtCore\..\..\src\corelib\kernel\qvariant.h:303: instantiated from `bool QVariant::canConvert() const [with T = Application]'
    C:\Documents and Settings\U502136\Mes documents\C++\appExtractor\models\ApplicationModel.cpp:64: instantiated from here
    C:\Qt\4.3.0\include\QtCore\..\..\src\corelib\kernel\qmetatype.h:168: error: `qt_metatype_id' is not a member of `QMetaTypeId<Application>'
    :: === Build finished: 1 errors, 0 warnings ===
    Je vais chercher pour voir comment je peux résoudre ce problème qui m'est assez obscur. Je soupsonne l'absence de la macro Q_OBJECT dans la définition de mes classes metier.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    QVariant ApplicationModel::data(const QModelIndex& index, int role) const
    {
      int row = index.row();
      if ((index.column() == 0) && (row >= 0) && (row < rowCount()))
      {
        return QVariant(QVariant::UserType, &applist_[row]);
      }
      return (QVariant::Invalid);
    }

    ne devrait pas plutôt être

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    QVariant ApplicationModel::data(const QModelIndex& index, int role) const
    {
      int row = index.row();
      if ((index.column() == 0) && (row >= 0) && (row < rowCount()))
      {
        QString s =  applist_[row];
        return QVariant( s);
      }
      return (QVariant::Invalid);
    }

  7. #7
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Par défaut
    Ah! Merci! ça m'a beaucoup aider, déjà, ça compile. Mais je ne parviens toujours pas à afficher ce que je voudrais afficher.
    En fait il y a bien le nombre d'élément, mais il n'y a aucun texte. Il semble que l'operateur Application::operator QString() ne soit pas utilisé.

    En ce qui concerne ta suggestion, cela ne me satisfait pas vraiment, puisque je voudrai récuperer les objets pour pouvoir les éditer.

    Cependant je suppose que je peux retourner deux choses différentes selon que le ce soit le role display ou édit en paramètre... je vais essayer ça.

    Edit: J'arrive à présent à les afficher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. QTreeView, QListView et leurs copains
    Par Alouka dans le forum Qt
    Réponses: 2
    Dernier message: 12/01/2007, 08h36
  2. QListView : encapsulation/affichages
    Par ledjlale dans le forum Qt
    Réponses: 2
    Dernier message: 08/11/2006, 09h12
  3. [Qt] Lister les elements d'une QListView
    Par MonsieurAk dans le forum Qt
    Réponses: 3
    Dernier message: 16/05/2006, 20h40
  4. QListView
    Par transistor49 dans le forum Qt
    Réponses: 8
    Dernier message: 31/05/2005, 18h23

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