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

Discussion :

Modèle-vue et utilisation des délégués

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut Modèle-vue et utilisation des délégués
    Bonjour à tous,

    Je réalise actuellement une IHM permettant l'ouverture en lecture/écriture d'un fichier "tablué" par l'intermédiaire d'un tableau:
    • la vue est représentée par une QTableView,
    • le model est un QStandardItemModel,
    • le controller (c'est lui qui me cause des problèmes) devra être dérivé de QStyledItemDelegate


    La construction de la vue, l'intégration du modèle et son remplissage ne pose pas de problème. C'est lorsque j'intègre un 'delegate' à mon modèle que j'ai un soucis:
    - Sans l'intégration du 'delegate', mon tableau et son contenu (les cellules) sont visbles,
    - En ajoutant un 'delegate', je n'ai plus que les headers de visibles, le contenu de mon tableau est vide: c'est à dire que je ne vois même plus la démarcation des lignes ni des colonnes...

    EDIT: Rajout de capture d'écran en PJ qui seront bien plus parlantes

    ci dessous la fonction qui affiche mon tableau:
    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
     
    void WEdit::updateTable(FileEdit* file){
        //clean up
        cleanTable();
     
        modelTable = new QStandardItemModel(file->getSignals().size(), file->getHeaders().size());
        modelTable->setHorizontalHeaderLabels(file->getHeaders());
        myTable->setModel(modelTable);
     
        //Set delegate
        // QStyledItemDelegate myDelegate; //essai 1
        TableDelegate myDelegate; //essai 2
        myTable->setItemDelegate(&myDelegate);
     
        //Feed myTable
        for (int row = 0; row < file->getSignals().size(); ++row) {
            for (int column = 0; column < file->getHeaders().size(); ++column) {
                QModelIndex index = modelTable->index(row, column, QModelIndex());
                modelTable->setData(index, QVariant(file->getSignals().at(row)->myParameters.value(file->getHeaders().at(column))));
            }
        }
     
        myTable->resizeColumnsToContents();
        myTable->horizontalHeader()->setStretchLastSection(true);
    }
     
    void WEdit::cleanTable(){
        if(!(NULL == myTable->selectionModel())){
            QItemSelectionModel *m = myTable->selectionModel();
            delete m;
        }
    }
    Les lignes de 10 à 13 concerne l'intégration de du fameux 'delegate'.
    Le problème survient également lorsque j'utilise directement un QStyledItemDelegate que je n'ai pas dérivé...

    Pouvez vous m'indiquer ce qu'il me manque pour que je puisse utiliser les delagates correctement ?
    Images attachées Images attachées   

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 5
    Par défaut
    Après lecture de la doc Qt j'ai appris qu' un model possède déjà un delegate par défaut qui s'adapte en fonction du contenu de la cellule (~item). Il est possible de se faire son propre delegate en dérivant QStyledItemDelegate.

    Ma classe TableDelegate est donc correcte de ce point de vue et je fait bien attention de redéfinir les méthodes createEditor(), setEditorData(), setModelData(), paint() et updateEditorGeometry();
    Pour mon test je choisis juste d'utiliser des QLineEdit en tant qu'editor.

    Malheureusement je me retrouve toujours avec une vue vide dès que je souhaite utiliser un delegate autre que celui par défaut...

    TableDelegate.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
     
    #ifndef TABLEDELEGATE_H
    #define TABLEDELEGATE_H
     
    #include <QStyledItemDelegate>
     
    class TableDelegate : public QStyledItemDelegate
    {
        Q_OBJECT
     
    public:
        explicit TableDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent) {}
        ~TableDelegate(){}
     
        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
        QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
        void setEditorData(QWidget *editor, const QModelIndex &index) const;
        void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
        void updateEditorGeometry ( QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
     
    };
     
    #endif // TABLEDELEGATE_H
    TableDelegate.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
     
    #include "TableDelegate.h"
     
    //test
    #include <QLineEdit>
    #include <iostream>
     
    void TableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{
        //Je le laisse faire le paint
        QStyledItemDelegate::paint(painter,option,index);
    }
     
    QWidget* TableDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const
    {
        // Création de l'éditeur, ici un simple QLineEdit 
        QLineEdit *lineEdit = new QLineEdit(parent);
        return lineEdit;
    }
     
    void TableDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{
        //Je l'initialise avec la valeur de type QString issue du model
        QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
        if(lineEdit){
            QString myCellText = index.model()->data(index).toString();
            lineEdit->setText(myCellText);
        }
    }
     
    void TableDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{
        //je renvoi la valeur au model
        QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
        if(lineEdit){
            model->setData(index,lineEdit->text());
        }
    }
     
    void TableDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const{
        Q_UNUSED(index);
        editor->setGeometry(option.rect);
    }
    J'avoue que je bloque un peu, je ne vois pas pourquoi le contenu de mon tableau "disparait"... la méthode paint doit être revue ? autre ? ...

Discussions similaires

  1. Utilisation des filtres dans un système Modèle/Vue
    Par devqt dans le forum Débuter
    Réponses: 11
    Dernier message: 16/06/2010, 11h25
  2. [POI]Utiliser des modèles de document, c'est possible ?
    Par hugo123 dans le forum Documents
    Réponses: 5
    Dernier message: 04/09/2006, 12h52
  3. Fonctionnement et utilisation des vues matérialisées
    Par gOgHi dans le forum Administration
    Réponses: 7
    Dernier message: 19/10/2004, 14h29
  4. Utilisation des vues
    Par Andry dans le forum Débuter
    Réponses: 2
    Dernier message: 19/07/2004, 08h00
  5. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44

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