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 :

Affichage dynamique dans une QListView


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Affichage dynamique dans une QListView
    Bonjour à tous !

    Alors je suis sur un projet d'annuaire/carnet d'adresses et dans ce cadre mon interface QT doit permettre différentes choses.

    L'utilisateur peut créer des contacts via une box dans laquelle il rempli différents champs (Nom, Prénom, etc ..) et l'ajoute à une QList.

    Cette liste est donc alimentée dynamiquement et j'aimerais afficher dans une QListView les noms et prénoms des contacts présents dans la liste et lors du double clic sur une des éléments de le liste, il faut afficher l’intégralité des variables de l’objet sélectionné dans une QTableView.

    Ce qui est fait :

    L'ihm globale, la QListView et QTableView, la box de saisie, l'ajout à la liste, l'objet "Contact" ;

    Où je bloque :

    Afficher les noms et prénoms dans la QListView et la mettre à jour lors de la modification de la liste ;

    Afficher toutes les valeurs d'un contact, sélectionné dans la QListView, dans la QTableView;

    Afficher le nombre de contacts dans la liste ;

    Le système de binding du C# était intéressant lorsque j'en faisait mais la c'est du c++ du coup je ne vois pas trop comment faire ..

    Niveau SIGNAL/SLOT je connais un minimum mais il y a surement des manques et niveau MVC je débute ..

    J'ai vu que je devais créer une classe héritant de QAbstractItemModel mais je suis perdu entre différentes notions et mécanismes ..

    SI quelqu'un a une idée afin de m'orienter ce serait trop gentil de sa part :p

    Le programme est un peu long, s'il faut je peux mettre des bouts de codes mais il faut que je sache quelles sont les parties pouvant vous aider à m'aider

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Je ne comprend pas l'intérêt d'utilise une QTableView pour afficher les détails du contact sélectionné. Pourquoi ne pas réutiliser la même vue utilisée pour la saisie d'un nouveau contact, en mode "read-only"?
    Une table view n'est rien d'autre qu'une list view avec plusieurs colonnes. Donc si le but est d'affiché un seul contact à la fois, cela ne servira à rien à mon avis.

    Sinon, il faut effectivement dérivé de QAbstractItemModel. Mais Qt fourni les classes d'aide QAbstractListModel ainsi que QAbstractTableModel qui sont déjà prévues pour faciliter l'implémentation des modèles pour QListView et QTableView. Plusieurs autres classes de modèles déjà implémentés existent aussi, tel que QStringListModel, QStandardItemModel, QFileSystemModel, QSqlQueryModel, QSqlTableModel, and QSqlRelationalTableModel.

    Pour remplir la QListView, vous avez 2 possibilités. Soit hériter de QAbstractListModel et implémenter l'affichage de vos données. Si le modèle ne doit pas être modifiable, c'est assez simple en soit. L'autre possibilité est de générer une simple QStringList depuis la liste de vos contacts, est ensuite l'afficher cette liste dans la QListView par le biais d'un QStringListModel. Cela évite d'implémenter son propre modèle, mais c'est un peu du bricolage à mon avis et je ne recommande pas cette méthode. Vous trouverez ci-dessous un exemple d'implémentation d'un modèle simple héritant de QAbstractListModel.

    Héritage de QAbstractListModel
    Qt creator fourni aussi un assistant pour créer une classe de type "Qt Item model" (mon installation en en anglais, je ne sais pas quel est l'équivalent en français) en faisant clique-droit sur le projet -> ajouter nouveau... puis en sélectionnant Qt à gauche, et "Qt Item Model" sur la droite.
    Nom : 2017-11-01 13_37_42-New File.png
Affichages : 2437
Taille : 32,8 Ko
    Nom : 2017-11-01 13_47_20-Qt Item Model.png
Affichages : 2434
Taille : 32,4 Ko
    Qt Creator va alors créer une nouvelle classe avec 2 fonctions prédéfinies, rowCount() et data() qui sont les seules à implémenter.

    Voici un exemple basique:
    mylistmodel.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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #ifndef MYLISTMODEL_H
    #define MYLISTMODEL_H
     
    #include <QAbstractListModel>
     
    class MyData{
    public:
        QString firstname;
        QString lastname;
        QString info1;
        QString info2;
     
        QString fullname() const{
            return firstname + " " + lastname;
        }
    };
     
    typedef QList<MyData> MyDataList;
     
    class MyListModel : public QAbstractListModel
    {
        Q_OBJECT
     
    public:
        explicit MyListModel(QObject *parent = nullptr);
     
        // Basic functionality:
        int rowCount(const QModelIndex &parent = QModelIndex()) const override;
     
        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
     
        MyDataList list() const;
        void setList(const MyDataList &list);
     
    private:
     
        MyDataList m_list;
    };
     
    #endif // MYLISTMODEL_H
    mylistmodel.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
    #include "mylistmodel.h"
     
    MyListModel::MyListModel(QObject *parent)
        : QAbstractListModel(parent)
    {
    }
     
    int MyListModel::rowCount(const QModelIndex &parent) const
    {
        // For list models only the root node (an invalid parent) should return the list's size. For all
        // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
        if (parent.isValid())
            return 0;
     
        return m_list.size();
    }
     
    QVariant MyListModel::data(const QModelIndex &index, int role) const
    {
        if (!index.isValid())
            return QVariant();
     
        int row = index.row();
        if(row < 0 || row >= m_list.size())
            return QVariant();
     
        switch(role){
            case Qt::DisplayRole:
            case Qt::EditRole: //not necessary for read-only model
                return m_list.at(row).fullname();
        }
     
        return QVariant();
    }
     
    MyDataList MyListModel::list() const
    {
        return m_list;
    }
     
    void MyListModel::setList(const MyDataList &list)
    {
        beginResetModel();
        m_list = list;
        endResetModel();
    }
    Pour ce qui est de l'affichage des infos d'un contact, il est possible d'utiliser les signaux void clicked(const QModelIndex &index) et void doubleClicked(const QModelIndex &index) afin de détecter le clique ou double-clique sur un élément de la liste, ensuite il faut récupérer l'élément grâce à son index et l'afficher dans une vue prévue à cet effet. Comme je l'ai dit je ne pense pas qu'une QTableView soit adapté pour cela.

    Au niveau du code, cela donnera quelque chose comme cela:
    mywidget.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyWidget : public QWidget
    {
    public:
        explicit MyWidget(QWidget *parent = 0);
        ...
    private slots:
        void contactClicked(const QModelIndex &index);
    ...
    private:
        MyListModel *m_myModel;
    ...
    };
    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
    MyWidget::MyWidget(QWidget *parent = 0)
    : QWidget(parent), ui(new Ui::MyWidget)
    {
        ui->setupUi(this);
     
        m_myModel = new MyListModel(this);
        m_myModel.setList(getContactList())
        ui->listView.setModel(m_myModel);
        connect(ui->listView, &QlistView::clicked, this, &MyWidget::contactClicked);
    }
     
    void MyWidget::contactClicked(const QModelIndex &index)
    {
        if(index < 0 || index >m_contactList.size())
            return;
        displayContact(index.row()); 
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Merci pour ta réponse Gojir4

    J'avais commencé à implémenter une classe héritant de QAbstractListModel, (ressemblant beaucoup à celle que tu as écrite ) mais étant donné le peu de fonctionnalité dont j'ai besoin pour ma vue je suis passé par une autre méthode.
    Mais je vais comparer nos deux codes afin de voir un peu le fonctionnement et cela me servira surement pour la suite de mon projet .

    J'ai donc effectivement utilisé la seconde méthode dont tu as parlé, (avant de voir ta réponse d'ailleurs c'est marrant:p), qui est une QStringList générée à partir de ma QList, affichée dans la QStringView via un QStringListModel et cela fonctionne plutôt bien, l'index de ma QListView est identique à celui de ma QList et je rafraîchi cette QStringList et l'applique au modèle dès changement dans la liste de contacts.

    L'affichage des détails du contact se fait en sélectionnant un contact dans la QListView, récupérant le QModelIndex, le passant en valeur d'index pour l'accès à la QList et modifiant les valeur d'affichage des QLabel du QGridLayout où sont affichés les infos du contact via les Getteur de ma classe contact. Je ne passe pas par un QTableView pour cela.

    L'utilisation de la QTableView va être utilisée pour afficher un regroupement de certains contacts dans un "carnet d'affaire" qui sert à regrouper et à voir toutes les infos de ces contacts sur la même vue.
    Je n'ai pas encore travailler sur cette partie, je m'y met aujourd'hui.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Dans ce cas (affichage de plusieurs contacts dans un QTableView), l'idéal serait en fait d'implémenter directement un classe qui hérite de QAbstractTableModel, ensuite ce modèle pourra être utilisé aussi bien pour un QListView que pour une QTableView. Cependant ce n'est pas bien plus compliqué que l'implémentation d'un QAbstractListModel, il faut simplement ajouter la fonction "columnCount()" ainsi que modifier l'implémentation de la fonction "data()".

    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
    QVariant MyModel::data(const QModelIndex &index, int role) const
    {
    ...
        if(role == Qt::DisplayRole || role == Qt::EditRole)
            switch(index.column()){
                 case 0: return m_list.at(index.row).firstname();
                 case 1: return m_list.at(index.row).lastname();
                 case 2: return m_list.at(index.row).email();
            }
    ...
    }
     
    int MyModel::columnCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent)
        return NB_COLUMN;
    }
    Au besoin je peux partager un code plus détaillé. J'ai développé il y a quelque temps un modèle justement pour afficher une liste de contacts (clients) dans une QTableView. Par contre c'est un peu complexe car le modèle permet aussi de faire du tri et du filtrage, en utilisant un QSortFilterProxyModel, du drag and drop entre plusieurs QTableView, est compatible avec QML, éditable et permet de restaurer les éléments de la listes qui ont été préalablement supprimé. Néanmoins je peux simplifier le code et le partager si cela vous intéresse.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Et bien je t'avoue que je suis preneur pour ton partage de code

    Après la partie filtrage et drag n drop m’intéresse également car je n'en ai pas fait lors de mes différents projet et ce pourra bien m'aider a comprendre le principe de fonctionnement ^^

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Voici (enfin) le code comme promis. Il m'as fallu dépoussiérer tout ça :D

    J'ai mis le projet dans un zip, en pièce jointe, sinon cela aurait-été illisible sur un post.

    C'est un simple projet avec un widget qui montre comment utiliser le modèle avec QListView et QTableView, comment filtrer ou trier les données et comment activer le drag only, drag & drop ou drop only.

    Tu trouveras 2 classes, Customer et CustomerModel.
    Customer est vraiment très basique, nom, prénom, entreprise et e-mail. Mais il est facile d'ajouter ce qui est nécessaire.
    CustomerModel implémente le modèle pour gérer et afficher une liste de Customer.

    Note que c'est ma première implémentation du drag & drop donc je ne garantis pas que cela soit dépourvu de bugs, comme pour le reste du projet d'ailleurs.

    Il n'y a pas beaucoup de commentaires dans le code mais n'hésite pas à poster tes questions ici ou en mp en cas de besoin.
    Fichiers attachés Fichiers attachés

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Yes merci beaucoup ^^ Tu déchires :p
    Je vais décortiquer tout ça afin de comprendre un peu comment ça fonctionne et voir comment l'adapter à mon programme, je te tiens au courant de la suite

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Et bonne année à toi Gojir4 et les viewers de passage :p

    Donc voila où j'en suis à présent :

    J'ai mon modèle perso héritant de QAbstractListModel :

    model.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
    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
    //========Modèle redéfini pour la QStringListModel========//
    class MyListModel : public QAbstractListModel
    {
        Q_OBJECT
     
    public :
        MyListModel(const QStringList &a_slStringList, QObject *parent = 0)
            : QAbstractListModel(parent), m_slStringList(a_slStringList)
        {}
     
        ~MyListModel();
     
    //    int rowCount(const QModelIndex &parent) const;
     
    //    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
        bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) ;
        QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const ;
     
        Qt::ItemFlags flags(const QModelIndex &index) const ;
     
        bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());//bool insertRows(int position, int rows, const QModelIndex &parent);
        bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());//bool removeRows(int position, int rows, const QModelIndex &parent);
     
        QStringList stringList() const;
        void setStringList(const QStringList &slStringList);
     
    private :
        QStringList m_slStringList{};
    };
     
     
     
    class MyContactListModel : public MyListModel
    {
        Q_OBJECT
     
    public :
        MyContactListModel(const QStringList &a_slStringList, QList<DataSheet *> *a_pContactList, QObject *parent = 0)
            : MyListModel(a_slStringList, parent), m_pMyContactList(a_pContactList)
        {}
     
        ~MyContactListModel();
     
        int rowCount(const QModelIndex &parent = QModelIndex()) const ;
     
        QVariant data(const QModelIndex &index, int role) const ;
     
        QList<DataSheet *> *m_pMyContactList{};
    };
     
    class MyCorpListModel : public MyListModel
    {
        Q_OBJECT
     
    public :
        MyCorpListModel(const QStringList &a_slStringList, QList<DataSheetCorp *> *a_pCorpList, QObject *parent = 0)
            : MyListModel(a_slStringList, parent), m_pMyCorpList(a_pCorpList)
        {}
     
        ~MyCorpListModel();
     
        int rowCount(const QModelIndex &parent = QModelIndex()) const ;
     
        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const ;
     
        QList<DataSheetCorp *> *m_pMyCorpList{};
    };
    model.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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    //========Modèle de liste perso========//
    MyListModel::~MyListModel()
    {}
     
    MyContactListModel::~MyContactListModel()
    {}
     
    MyCorpListModel::~MyCorpListModel()
    {}
     
     
     
     
     
    int MyContactListModel::rowCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        //return m_pMyContactList->count();
        //return m_slStringList.count();
        return stringList().count();
    }
     
    QVariant MyContactListModel::data(const QModelIndex &index, int role) const
    {
        if (!index.isValid())
            return QVariant();
     
        if (index.row() < 0 || index.row() >= stringList().size())//if (index.row() >= m_slStringList.size())//if (index.row() >= m_pMyContactList->size())
            return QVariant();
     
        if (role == Qt::DisplayRole)
            //return stringList().at(index.row());
            return QVariant(m_pMyContactList->at(index.row())->data(Qt::DisplayRole));//->GetFullName();//->data(Qt::DisplayRole);
            //return m_pMyContactList->at(index.row())->GetFullName();
     
        else
            return QVariant::Invalid;
    }
     
    int MyCorpListModel::rowCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        //return m_slStringList.count();//return m_pMyCorpList->count();
        return stringList().count();
    }
     
    QVariant MyCorpListModel::data(const QModelIndex &index, int role) const
    {
        if (!index.isValid())
            return QVariant();
     
        if (index.row() < 0 || index.row() >= stringList().size())//if (index.row() >= m_pMyCorpList->size())
            return QVariant();
     
        if (role == Qt::DisplayRole)
            //return stringList().at(index.row());
            return QVariant(m_pMyCorpList->at(index.row())->data(Qt::DisplayRole));//->GetCorpName();//->data(Qt::DisplayRole);
            //return m_pMyCorpList->at(index.row())->GetCorpName();
     
        else
            return QVariant::Invalid;
    }
     
     
     
    bool MyListModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if(index.isValid() && role == Qt::EditRole)
        {
            m_slStringList.replace(index.row(), value.toString());
     
            emit dataChanged(index, index);
     
            return true;
        }
     
        return false;
    }
     
    QVariant MyListModel::headerData(int section, Qt::Orientation orientation, int role) const
    {
        if (role != Qt::DisplayRole)
            return QVariant();
     
        if (orientation == Qt::Horizontal)
            return QString("Column %1").arg(section);
        else
            return QString("Row %1").arg(section);
    }
     
    Qt::ItemFlags MyListModel::flags(const QModelIndex &index) const
    {
        if (!index.isValid())
            return Qt::ItemIsEnabled;
     
        return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
    }
     
    bool MyListModel::insertRows(int position, int rows, const QModelIndex &index)
    {
        Q_UNUSED(index);
     
        beginInsertRows(QModelIndex(), position, position + rows - 1);
     
        for (int row = 0 ; row < rows ; ++row)
        {
            m_slStringList.insert(position, "");
        }
     
        endInsertRows();
     
        return true;
    }
     
    bool MyListModel::removeRows(int position, int rows, const QModelIndex &index)
    {
        Q_UNUSED(index);
     
        beginRemoveRows(QModelIndex(), position, position + rows - 1);
     
        for (int row = 0 ; row < rows ; ++row)
        {
            m_slStringList.removeAt(position);
        }
     
        endRemoveRows();
     
        return true;
    }
     
    QStringList MyListModel::stringList() const
    {
        return m_slStringList;
    }
     
    void MyListModel::setStringList(const QStringList &strings)
    {
        if(m_slStringList == strings)
            return;
     
        m_slStringList = strings;
    }
    Je pense ne pas m’être trop trompé, si c'est le cas il faut me le dire :p

    Le truc c'est qu'il ne m'affiche seulement le premier élément de ma liste dans la QListView .. malgré qu'en debug, je vois bien qu'il y a plusieurs éléments ds ma liste et je ne vois pas trop pourquoi ..

    J'utilisais un QCompleter pr effectuer une recherche dans la liste, (avant la mise en place du modèle perso cela fonctionnait, je rafraîchissait même la QListView en fonction du terme recherché) mais à présent plus rien ne s'affiche lors de la recherche ..
    Et pr régler le problème des doublons dans la liste (chose sensée être possible) j'ai mis en place un ID pr chaque contact et pour chaque entreprise afin de les différencier.

    Ci-dessous le code de la partie contenant ma QListView dans mon IHM :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    //========Dock Gauche Exploration========//
        //GroupBox de la liste des contacts
        m_pGroupBoxContactList = new QGroupBox(tr("Phonebook Contents"));
        m_pGroupBoxContactList->setMaximumWidth(200);
     
        //Layout Explo Contacts
        m_pVBoxLayoutExplo = new QVBoxLayout;
     
      //==Recherche de contacts==//
        //QCompleter pr filtrage lors de la recherche de contacts
        m_pCompleterSearchContact = new QCompleter(this);
        m_pCompleterSearchContact->setCaseSensitivity(Qt::CaseInsensitive);
        m_pCompleterSearchContact->setFilterMode(Qt::MatchContains);
     
        //QCompleter pr filtrage lors de la recherche d'entreprises
        m_pCompleterSearchCorp = new QCompleter(this);
        m_pCompleterSearchCorp->setCaseSensitivity(Qt::CaseInsensitive);
        m_pCompleterSearchCorp->setFilterMode(Qt::MatchContains);
     
        //Champs de recherche de contacts
        m_pTextBoxSearchContact = new QLineEdit(tr("Search contact... "));
        m_pTextBoxSearchContact->setMaximumWidth(160);
        m_pTextBoxSearchContact->setCompleter(m_pCompleterSearchContact);
        connect(m_pTextBoxSearchContact, SIGNAL(textChanged(QString)), this, SLOT(SearchContact(QString)));
     
        //Champs de recherche d'entreprises
        m_pTextBoxSearchCorp = new QLineEdit(tr("Search corp... "));
        m_pTextBoxSearchCorp->setMaximumWidth(160);
        m_pTextBoxSearchCorp->setCompleter(m_pCompleterSearchCorp);
        connect(m_pTextBoxSearchCorp, SIGNAL(textChanged(QString)), this, SLOT(SearchContact(QString)));
     
      //==Boutons Création Nouveau Contact==//
        m_pButtonNewContact = new QPushButton(tr("New Contact"));
        m_pButtonNewContact->setIcon(QIcon(":/Icones/Icones/address_book_add.ico"));
        //Layout du bouton
        m_pLayoutButtonNewContact = new QHBoxLayout;
        m_pLayoutButtonNewContact->addWidget(m_pButtonNewContact);
        m_pLayoutButtonNewContact->setAlignment(Qt::AlignRight);
        //Connexion du bouton à son action
        connect(m_pButtonNewContact, SIGNAL(clicked()), this, SLOT(AddNewContact()));
     
      //==Barre de tab==//
        //Tab Control
        m_pExploTabs = new QTabWidget;
        m_pExploTabs->setMaximumWidth(200);
     
        //Tab Contact
        m_pExploTabContact = new QWidget;
        m_pVBoxLayoutExploTabContact = new QVBoxLayout;
     
        m_pExploListView = new QListView;
        //m_pExploListModel = new QStringListModel(m_slExploListContact, this);
        m_pExploListModel = new MyContactListModel(m_slExploListContact, m_MyPhoneBook.m_pSheetList, this);
     
        m_pExploListView->setMinimumWidth(100);
        m_pExploListView->setMaximumWidth(200);
        m_pExploListView->setEditTriggers(QAbstractItemView::NoEditTriggers);//Empeche la modification des champs dans la QListView
        m_pExploListView->setContextMenuPolicy(Qt::CustomContextMenu);//Menu contextuel avec clic droit sur la QListView
     
        m_pVBoxLayoutExploTabContact->addWidget(m_pTextBoxSearchContact);
        m_pVBoxLayoutExploTabContact->addWidget(m_pExploListView);
        m_pExploTabContact->setLayout(m_pVBoxLayoutExploTabContact);
     
        //Connexion du signal de selection d'un contact avec la fonction d'affichage des infos du contact dans l'onglet
        connect(m_pExploListView, SIGNAL(clicked(QModelIndex)), this, SLOT(DisplayContact(QModelIndex)));
        //Connexion du signal de clic droit (Menu contextuel) sur la QListView
        connect(m_pExploListView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ClicContextMenuOnListView(const QPoint &)));
     
        //Tab Corp
        m_pExploTabCorp = new QWidget;
        m_pVBoxLayoutExploTabCorp = new QVBoxLayout;
     
        m_pExploListCorpView = new QListView;
        //m_pExploListCorpModel = new QStringListModel(m_slExploListCorp, this);
        m_pExploListCorpModel = new MyCorpListModel(m_slExploListCorp, m_MyPhoneBook.m_pSheetListCorp, this);
     
        m_pExploListCorpView->setMinimumWidth(100);
        m_pExploListCorpView->setMaximumWidth(200);
        m_pExploListCorpView->setEditTriggers(QAbstractItemView::NoEditTriggers);//Empeche la modification des champs dans la QListView
        m_pExploListCorpView->setContextMenuPolicy(Qt::CustomContextMenu);//Menu contextuel avec clic droit sur la QListView
     
        m_pVBoxLayoutExploTabCorp->addWidget(m_pTextBoxSearchCorp);
        m_pVBoxLayoutExploTabCorp->addWidget(m_pExploListCorpView);
        m_pExploTabCorp->setLayout(m_pVBoxLayoutExploTabCorp);
     
        //Connexion du signal de selection d'une entreprise avec la fonction d'affichage des infos de l'entreprise dans l'onglet
        connect(m_pExploListCorpView, SIGNAL(clicked(QModelIndex)), this, SLOT(DisplayCorp(QModelIndex)));
        //Connexion du signal de clic droit (Menu contextuel) sur la QListView
        connect(m_pExploListCorpView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ClicContextMenuOnListView(const QPoint &)));
     
        m_pExploTabs->addTab(m_pExploTabContact, tr("Contact"));
        m_pExploTabs->addTab(m_pExploTabCorp, tr("Corporation"));
     
      //==Ajout des éléments dans le layout==//
        m_pVBoxLayoutExplo->addLayout(m_pLayoutButtonNewContact);
        m_pVBoxLayoutExplo->addWidget(m_pExploTabs);
     
        //Ajout du layout au GroupBox
        m_pGroupBoxContactList->setLayout(m_pVBoxLayoutExplo);//

    La partie création et ajout d'un contact ds la liste :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
        if ((m_pContactName->text() != "" && m_pContactFirstName->text() != "") && m_pCorpName->text() != "")
        {
        //Création de la fiche contact
            DataSheet *MySheetContact = new DataSheet(m_pContactCivility->currentText(), m_pContactName->text(), m_pContactFirstName->text(), m_pContactMail1->text(),
                             m_pContactMail2->text(), m_pContactAdress->text(), m_pContactCity->text(), m_pContactState->text(), m_pContactCountry->text(),
                             m_pContactFunction->text(), m_pContactDepartment->text(), m_pContactVarious->text(),
                             m_pContactZipCode->text(), m_pContactPhoneNumber->text().toInt(), m_pContactOtherPhoneNumber->text().toInt(),
                             m_pContactCellPhoneNumber->text().toInt(), m_pContactFaxNumber->text().toInt());
     
            //Attribution de l'ID au contact
            MySheetContact->SetContactId(m_pParent->m_MyPhoneBook.GetCountContactID() + 1);
     
            //Mise a jour de ContactID du PhoneBook
            m_pParent->m_MyPhoneBook.SetCountContactID(m_pParent->m_MyPhoneBook.GetCountContactID() + 1);
     
        //Création de la fiche entreprise
            //Si aucune entreprise n'est sélectionnée dans la combobox(donc index 0)
            if(m_pComboxExistingCorp->currentIndex() == 0)
            {
                //Création d'une nouvelle entreprise
                DataSheetCorp *MySheetCorp = new DataSheetCorp(m_pCorpName->text(), m_pCorpMail1->text(), m_pCorpMail2->text(), m_pCorpAdress->text(), m_pCorpCity->text(),
                                      m_pCorpState->text(), m_pCorpCountry->text(), m_pCorpVarious->text(), m_pCorpWebAdress->text(),
                                      m_pCorpPaymentCondition->text(), m_pCorpZipCode->text(), m_pCorpTVAIntra->text(), m_pCorpPhoneNumber->text().toInt(),
                                      m_pCorpOtherPhoneNumber->text().toInt(), m_pCorpFaxNumber->text().toInt(), m_pCorpSiretNumber->text().toInt());
     
                //Attribution de l'ID à l'entreprise
                MySheetCorp->SetCorpId(m_pParent->m_MyPhoneBook.GetCountCorpID() + 1);
     
                //Attribution de l'ID de l'entreprise à la variable de l'ID Corp du contact
                MySheetContact->SetCorpId(MySheetCorp->GetCorpId());
     
                //Mise a jour de CorpID du PhoneBook
                m_pParent->m_MyPhoneBook.SetCountCorpID(m_pParent->m_MyPhoneBook.GetCountCorpID() + 1);
     
                //Ajout à la liste des entreprises
                m_pParent->m_MyPhoneBook.m_pSheetListCorp->push_back(MySheetCorp);
            }
            else
            {
                //Récupération de l'ID de l'entreprise existante selectionnée au contact en cours de création
                MySheetContact->SetCorpId(m_pCorpID->text().toInt());
            }
     
            //Ajout à la liste de contacts
            m_pParent->m_MyPhoneBook.m_pSheetList->push_back(MySheetContact);
     
        //Partie ajout des noms des contacts dans la ListView des contacts
            //MAJ de l'affichage des contacts
            m_pParent->m_slExploListContact.clear();
     
            for (int i = 0 ; i < m_pParent->m_MyPhoneBook.m_pSheetList->size() ; ++i)
            {
    //            MyQString s = (m_pParent->m_MyPhoneBook.m_pSheetList->at(i)->GetContactName() + " " + m_pParent->m_MyPhoneBook.m_pSheetList->at(i)->GetContactFirstName());
    //            s.SetId(m_pParent->m_MyPhoneBook.m_pSheetList->at(i)->GetContactId());
    //            m_pParent->m_slExploListContact << s;
     
                QString s = m_pParent->m_MyPhoneBook.m_pSheetList->at(i)->GetFullName();
                m_pParent->m_slExploListContact << s;
            }
     
            //Attribution de la String List au model
            m_pParent->m_pExploListModel->setStringList(m_pParent->m_slExploListContact);
            //Attribution du modele à la vue
            m_pParent->m_pExploListView->setModel(m_pParent->m_pExploListModel);
     
     
        //Partie ajout des noms d'entreprise dans la ListView des entreprises
            //MAJ de l'affichage des entreprises
            m_pParent->m_slExploListCorp.clear();
     
            for (int i = 0 ; i < m_pParent->m_MyPhoneBook.m_pSheetListCorp->size() ; ++i)
            {
    //            MyQString s = (m_pParent->m_MyPhoneBook.m_pSheetListCorp->at(i)->GetCorpName());
    //            s.SetId(m_pParent->m_MyPhoneBook.m_pSheetListCorp->at(i)->GetCorpId());
    //            m_pParent->m_slExploListCorp << s;
     
                QString s = m_pParent->m_MyPhoneBook.m_pSheetListCorp->at(i)->GetCorpName();
                m_pParent->m_slExploListCorp << s;
            }
     
            //Attribution de la String List au model
            m_pParent->m_pExploListCorpModel->setStringList(m_pParent->m_slExploListCorp);
            //Attribution du modele à la vue
            m_pParent->m_pExploListCorpView->setModel(m_pParent->m_pExploListCorpModel);
     
     
        //Mise a jour de la sauvegarde du carnet d'adresses
            m_pParent->SavePhoneBookXML();
     
            this->close();
        }
    Du coup avec tout cela je suis un peu paumé et je vois pas où ça déconne .. les ID fonctionnent, mais avec un seul élément afficher dans la QListView c'est dur de savoir si c'est le bon ID qui est pris en compte.

    Qu'en pensez vous ?

Discussions similaires

  1. [AJAX] Affichage dynamique dans une pop-up
    Par benoit-v dans le forum AJAX
    Réponses: 0
    Dernier message: 03/12/2014, 11h51
  2. [Débutant] Affichage dynamique dans une form principale
    Par diblasio dans le forum C#
    Réponses: 4
    Dernier message: 12/04/2012, 21h06
  3. Affichage dynamique dans une JFrame
    Par crocodingo dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 17/03/2009, 18h27
  4. Affichage dynamique d'une requete Access dans Excel
    Par alex830001 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/06/2008, 16h54
  5. Affichage et alignement vertical dynamique dans une page lors d'un clic
    Par Invité dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/05/2008, 22h08

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