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 :

Insérer des QSpinBox dans un tableau

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut Insérer des QSpinBox dans un tableau
    Je crois que la question est dqns le titre. Comment faire pour faire en sorte qu'une celulle d'un tableau (QStandardItemModel) soit une QSpinBox?

    Voici le code que j'utilise:
    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
     
     
    ...
    mod = new QStandardItemModel(0,3);
    	mod->setHeaderData(0, Qt::Horizontal,"Produit");
    	mod->setHeaderData(1, Qt::Horizontal,"Quantité");
    	mod->setHeaderData(2, Qt::Horizontal,"Poids");
     
            QStandardItem *item = new QStandardItem(produit->currentText());
        	mod->appendRow(item);
        	item->setEditable(false);
     
            QStandardItem *item2 = new QStandardItem();    
        	item2->setText("1");
        	item2->setEditable(true);
        	mod->setItem(mod->rowCount()-1,1,item2);
     
     
    	table = new QTableView;
            table->setModel(mod);
    Voilà en gros je voudrais que ma colonne quantité ait des QSpinBox au lieu d'être simplement éditable.

    Merci d'avance

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Merci pour l'info je n'avais pas vu. Comment as-tu trouvé l'utilisation du delegate?

    Bon alors j'ai copié le delegate.h et le delegate.cpp et j'ai rajouté les lingnes suivantes dans mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        SpinBoxDelegate delegate;
        table->setItemDelegate(delegate);
    En suivant le principe du main.cpp. Mais j'obtiens ce message d'erreur:

    Commandes.cpp: In member function 'void FenPrincipale::creerCommande()':
    Commandes.cpp:87: error: request for member 'setItemDelegate' in '((FenPrincipale*)this)->FenPrincipale::table', which is of non-class type 'QTableView*'
    make: *** [Commandes.o] Error 1


    Mais tout cela ne résout pas mon problème. Comment faire pour atribuer une QSpinbox à une seule cellule? Ici il applique le principe du delegate sur l'ensemble de la QTableView...

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Oui pour le premier. J'ai justement copié les delegate.h et delegate.cpp dans mon project et ajouté les lignes du main.cpp, comme dit plus haut...

    Je vais voir le deuxième. Le fait d'utiliser les delegate sur une seule colone est déjà plus proche de ce que je veux faire...

    Mais c'est étonnant que ce ne soit pas plus simple à faire...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Bon alors voilà où j'en suis...

    j'ai 5 fichiers: main.cpp, FenPrincipale.cpp, Fenprincipale.h, delegate.h et delegate.cpp.

    les voici:

    Fenprincipale.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
     
    #ifndef HEADER_FENPRINCIPALE
    #define HEADER_FENPRINCIPALE
     
    #include <QtGui>
     
    class FenPrincipale : public QMainWindow
    {
        Q_OBJECT
     
        public:
            FenPrincipale();
     
        private:
    		QStandardItemModel *mod;
    		QTableView *table;
     
    };
    #endif
    FenPrincipale.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
     
    #include "FenPrincipale.h"
    #include "delegate.h"
     
    FenPrincipale::FenPrincipale()
    {
        mod = new QStandardItemModel(0,3);
    	mod->setHeaderData(0, Qt::Horizontal,"Produit");
    	mod->setHeaderData(1, Qt::Horizontal,"Quantité");
    	mod->setHeaderData(2, Qt::Horizontal,"Poids");
     
    	table = new QTableView;
        table->setModel(mod);
        SpinBoxDelegate delegate;
        table->setItemDelegate(delegate);
     
         for (int row = 0; row < 4; ++row) {
             for (int column = 0; column < 3; ++column) {
                 QModelIndex index = mod->index(row, column, QModelIndex());
                 mod->setData(index, QVariant((row+1) * (column+1)));
             }
         }
     
         table->setWindowTitle(QObject::tr("Spin Box Delegate"));
         table->show();
    }
    delegate.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
     
     #ifndef DELEGATE_H
     #define DELEGATE_H
     
     #include <QItemDelegate>
     #include <QModelIndex>
     #include <QObject>
     #include <QSize>
     #include <QSpinBox>
     
     class SpinBoxDelegate : public QItemDelegate
     {
         Q_OBJECT
     
     public:
         SpinBoxDelegate(QObject *parent = 0);
     
         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
    delegate.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
     
     #include <QtGui>
     
     #include "delegate.h"
     
     SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
         : QItemDelegate(parent)
     {
     }
     
     QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
         const QStyleOptionViewItem &/* option */,
         const QModelIndex &index) const
     {
     
    	if (index.column()  == 1)
    	{
    		QSpinBox *editor = new QSpinBox(parent);
    		editor->setMinimum(0);
    		editor->setAccelerated(true);
    		editor->setSuffix("pcs");
    		return editor;
    	}
    	if(index.column()  == 2)
    	{
    		QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
    		editor->setMinimum(0);
    		editor->setAccelerated(true);
    		editor->setSuffix("Kg");
    		editor->setSingleStep(0.010);
    		return editor;
    	}
     
    }     
     
     
     void SpinBoxDelegate::setEditorData(QWidget *editor,
                                         const QModelIndex &index) const
     {
         if (index.column()  == 1)
    	 {
         	int value = index.model()->data(index, Qt::DisplayRole).toInt();
         	QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
         	spinBox->setValue(value);
    	 }
    	 if(index.column()  == 2)
    	 {
    	 	double value = index.model()->data(index, Qt::DisplayRole).toDouble();
    	 	QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
    	 	spinBox->setValue(value);
    	 }
     
     }
     
     void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                        const QModelIndex &index) const
     {
         if (index.column()  == 1)
    	 {
         	QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
         	spinBox->interpretText();
         	int value = spinBox->value();
     
         model->setData(index, value);
    	 }
    	 if(index.column()  == 2)
    	 {
    	 	QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
    	 	spinBox->interpretText();
            double value = spinBox->value();
     
         model->setData(index, value);
    	 }     
     
     }
     
     void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
         const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
     {
         editor->setGeometry(option.rect);
     }

    ET voici l'erreur que j'obtiens:

    FenPrincipale.cpp:14: error: no matching function for call to 'QTableView::setItemDelegate(SpinBoxDelegate&)'
    /usr/local/Trolltech/Qt-4.4.1/lib/QtGui.framework/Versions/4/Headers/qabstractitemview.h:136: note: candidates are: void QAbstractItemView::setItemDelegate(QAbstractItemDelegate*)
    make: *** [FenPrincipale.o] Error 1


    D'où vient mon erreur?

    Merci d'avance


    Ok c'est bon j'ai trouvé. J'ai oublié le "&" devant delegate...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    J'ai un doute du coup. Quand on fait

    QModelIndex index2 = mod->index(0, 2, QModelIndex());
    mod->setData(index2, QVariant(0.01));

    On obtient une spinbox à l'édition de la cellule (0,2) sans avoir recours au delegate. Il n'y a pas moyen de paramétrer cette spinbox?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par peuf23 Voir le message
    J'ai un doute du coup. Quand on fait

    QModelIndex index2 = mod->index(0, 2, QModelIndex());
    mod->setData(index2, QVariant(0.01));

    On obtient une spinbox à l'édition de la cellule (0,2) sans avoir recours au delegate. Il n'y a pas moyen de paramétrer cette spinbox?
    si je me trompe pas, le delegate utilisé depend de ce que tu as mis comme data.
    Et la comme tu as mis un double, l'editeur est une spinbox.

    Aprés, si tu peut expliquer un peu plus ce que tu cherche à faire, on devrais pouvoir mieux t'orienter

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 102
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup pour tes réponses, j'ai réussi à faire ce que je voulais avec les delegates...

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

Discussions similaires

  1. Insérer des string dans un tableau
    Par zooffy dans le forum ASP.NET
    Réponses: 9
    Dernier message: 24/02/2011, 11h28
  2. Réponses: 3
    Dernier message: 13/04/2010, 12h39
  3. Insérer des valeurs dans un tableau
    Par bassiste dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 08/12/2008, 13h44
  4. Insérer des cellules dans un tableau
    Par BkD35 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 04/12/2007, 22h00
  5. insérer des données dans un tableau lors d'une boucle
    Par sissi25 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/05/2007, 09h19

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