Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec delegue avec table QAbstractTableMod

    21 juin 2019 à 17:34:35

    Bonjour,

    Je constate que si modele est un pointeur QStandardItemModel, le delegue marche très bien. Mais si modele est un pointeur PaysTableModel (sous classe QAbstractTableModel) alors il ne fonctionne plus.
    Voici le code où j'ai activé volontairement QStandardItemModel *modele = new QStandardItemModel(4,2);

    Merci d'avance de votre aide.

    #include "essai0.h"
    #include "PaysTableModel.h"
    #include "delegue.h"
    #include <QApplication>
    #include <QStringList>
    #include <QTableView>
    #include <QHBoxLayout>
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv); QMainWindow mainWindow; QWidget tableWidget;
        QStringList listePays;
        listePays << "France" << "Angleterre" << "Espagne" << "Italie" << "Allemagne";
    //   PaysTableModel *modele = new PaysTableModel(listePays);
      Delegue *mydelegate = new Delegue();
    
    
              QStandardItemModel   *modele = new QStandardItemModel(4,2);
    
                    for(int row = 0; row < 4; ++row)
                    {
                        for(int col = 0; col < 2; ++col)
                        {
                           QModelIndex index = modele->index(row,col,QModelIndex());
                            modele->setData(index,0);
                        }
                   }
    
                    QTableView *vueTable = new QTableView;
                    vueTable->setModel(modele);
                    vueTable->setItemDelegate(mydelegate);
    
    
        QHBoxLayout *layout = new QHBoxLayout;
        layout->addWidget(vueTable);
        tableWidget.setLayout(layout);
        mainWindow.setCentralWidget(&tableWidget);
        mainWindow.setWindowTitle("Exemple 3");
        mainWindow.show();
        return app.exec();
        }
         



    • Partager sur Facebook
    • Partager sur Twitter
    RL
      22 juin 2019 à 17:07:11

      Salut,

      Pour avoir une réponse, tu devrais préciser ton problème, expliquer ce qui ne fonctionne pas (ne pas juste dire 'ça ne marche pas'), et poser une question claire.

      • Partager sur Facebook
      • Partager sur Twitter

      J'aime les bandes dessinées, manhuas, manhwas, mangas, comics... Du coup j'ai fait aralosbd.fr !

        23 juin 2019 à 13:57:48

        Salut,

        Et, surtout, pourrait-on voir à quoi ressemble ta classe Delegue, car c'est visiblement une classe personnalisée (sans doute basée sur QItemDelegate ou sur QStyleItemDelegate), mais, sans avoir plus d'information, il nous sera difficile de répondre ;).

        Trois petites remarques au passage:

        1- Une ligne == une instruction : Nous ne sommes plus à une époque où le moindre byte d'espace disque coute la moitié d'un bras ; déclares chaque variable sur une ligne différente; cela ne changera rien au binaire exécutable généré, mais cela facilitera énormément la lecture du code :D

        2- Tu devrais créer ta propre classe héritée de QMainWindow (appelons la MainWindow, pour faire simple) et y mettre presque tout le code de ta fonction main, qui devrait se limiter à

        int main(int argc, char *argv[])
        {
            QApplication app(argc, argv); 
            MainWindow mainWindow;
            mainWindow.show();
            return app.exec();
            }

        3- la fonction setCentralWidget() de la classeQMainWindow a pour effet d'introduire le widget indiqué dans le système de parents/enfant de la classeQMainWindow.

        Cela implique que la destruction de ton instance de QMainWindow provoquera forcément l'appel de delete sur le widget en question.  Or, l'appel de delete sur un pointeur dont la mémoire n'a pas été allouée avec new représente  un undefined behaviour  qui occasionnera sans doute un plantage à la fin de l'exécution, dans le cas présent.

        Ton TableWidget doit donc impérativement être créé sous la forme d'un pointeur alloué dynamiquement avec new ;)

        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

        Problème avec delegue avec table QAbstractTableMod

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown