2011-08-04 4 views
0

Je suis en train d'insérer des données dans un TableView d'un modèle mais je suis en train de faire quelque chose de mal, car les données ne sont pas inséré. La table est mise à jour avec les colonnes et les lignes bien.Les données de modèle non insérés dans QTableView

J'ai donc GraphicsView où je dessine quelques GraphicsItems personnalisés. Chaque fois qu'un nouvel élément est ajouté à la scène, le modèle est supposé être mis à jour et envoyer un signal à TableView pour y insérer également les données.

Ici, je mets à jour le modèle lorsque le nouvel élément est ajouté:

 

    Clothoid *temp = new Clothoid(); 
     temp->setStartPoint(p1); 
     temp->setEndPoint(p2); 

     clothoids.append(temp); 

     scene->addItem(temp); 

     model.setColumnCount(3); 
     model.setRowCount(clothoids.size()); 

     QModelIndex index = model.index(clothoids.size(), 1, QModelIndex()); 
     model.setData(index, clothoids.last()->startCurvature); 
     index = model.index(clothoids.size(), 2, QModelIndex()); 
     model.setData(index, clothoids.last()->endCurvature); 
     index = model.index(clothoids.size(), 3, QModelIndex()); 
     model.setData(index, clothoids.last()->clothoidLength); 

     emit clothoidAdded(&model); 


Clothoïdes étant une liste de mes graphicsItems personnalisés:

 

QList < Clothoid *> clothoids; 

Le signal est connecté à la fente dans ma fenêtre principale :

 

    ui->setupUi(this);  
     SpinBoxDelegate delegate; 
     ui->clothoidTable->setItemDelegate(&delegate); 

     connect(ui->graphicsView, SIGNAL(clothoidAdded(QStandardItemModel*)), ui->clothoidTable, SLOT(onClothoidAdded(QStandardItemModel*))); 


où la fente est:

 

    void TableViewList::onClothoidAdded(QStandardItemModel *model) 
     { 
      setModel(model); 
     } 

Qu'est-ce que je fais mal?

Répondre

1

Vous ne voulez pas appellerez setData() directement. Voici quelques étapes clés que vous devez prendre:

  • Votre modèle doit tenir un récipient (QList, peut-être) de pointeurs Clothoid (si elle est responsable de la libération des ressources ou non). L'index dans le conteneur doit correspondre directement à la ligne qu'il occupe dans la vue.

  • Votre data() et setData() doivent être correctement mis en œuvre, de sorte que le modèle sait quelle information Clothoïde va dans chaque cellule pour une ligne donnée. Ils devraient avoir switch() déclarations sur un enumreprésentant le numéro de colonne, comme ceci:


// in data() after the usual error checking, etc 
if(role == Qt::DisplayRole) 
    { 
    Clothoid* cloth = myListOfClothoids.at(index.row()); 
    switch(index.column()) 
     { 
     // This enum is defined in the header for the Clothoid class 
     // and represents the COLUMN NUMBER in which to show the data 
     case Clothoid::START: 
      return cloth->startCurvature; // these probably shouldn't be public members btw 
     case Clothoid::END: 
      return cloth->endCurvature; 
     case Clothoid::LENGTH: 
      return cloth->clothoidLength; 
     } 
    } 

// in setData() 
if(role == Qt::DisplayRole) 
    { 
    Clothoid* cloth = myListOfClothoids.at(index.row()); 
    switch(index.column()) 
     { 
     case Clothoid::START: 
      cloth->startCurvature = variant.toWhatever(); 
      break; 
     case Clothoid::END: 
      cloth->endCurvature = variant.toWhateverElse(); 
      break; 
     case Clothoid::LENGTH: 
      cloth->clothoidLength = variant.toYetSomethingElse(); 
      break; 
     default: 
      return false; 
     } 
    emit dataChanged(index,index); 
    return true; 
    } 
  1. Votre modèle doit avoir une fonction addClothoid(). Dans cette fonction que vous voulez faire quelque chose comme:

int rowIndexFirst = 0; // insert into first row 
int rowIndexLast = rowIndexFirst; // only inserting one row/Clothoid 
beginInsertRows(QModelIndex(), rowIndexFirst, rowIndexLast); 
myListOfClothoids.prepend(newClothoidPtr); // insert clothoid into first index, as well 
endInsertRows(); // begin and end take care of signalling the view for you! 

Je suggère vraiment le faire. Oui, c'est beaucoup de travail à refactoriser dans cette mesure, mais ça vaut le coup, croyez-moi.

Espérons que cela aide.

Questions connexes