2015-10-14 2 views
4

J'ai un QStandardItemModel, que je montre dans Q QTreeView. Fonctionne bien.Comment parcourir complètement un QStandardItemModel?

Pour mettre en évidence les lignes pertinentes, je veux en souligner certaines: J'ai donc une QStringList avec les noms des QStandItem * à mettre en surbrillance.

QStringList namesToBeHighlighted = getNames(); 

QModelIndex in = myModel->index(0, 0); 

if (in.isValid()) { 

    for (int curIndex = 0; curIndex < myModel->rowCount(in); ++curIndex) { 

     QModelIndex si = myModel->index(curIndex, 0, in); 
     QStandardItem *curItem = myModel->itemFromIndex(si); 

     if (curItem) { 
      QString curItemName = curItem->text(); 

      if (namesToBeHighlighted.contains(curItem->text())) { 
       curItem->setFont(highlightFont); 
      } 
      else curItem->setFont(unHighlightFont); 
     } 
    } 
} 

Mon modèle a la structure suivante:
level_1
+ -> Level_11
+ -> Level_12
+ -> Level_13
level_2
+ -> Level_21
+ -> Level_22
+ -> Level_23
...

Ici, il passe par les niveaux 11, 12 et 13 puis s'arrête.

Répondre

6

J'espère que cela vous aide:

void forEach(QAbstractItemModel* model, QModelIndex parent = QModelIndex()) { 
    for(int r = 0; r < model->rowCount(parent); ++r) { 
     QModelIndex index = model->index(r, 0, parent); 
     QVariant name = model->data(index); 
     qDebug() << name; 
     // here is your applicable code 
     if(model->hasChildren(index)) { 
      forEach(model, index); 
     } 
    } 
} 

QStandardItemModel model; 
    QStandardItem* parentItem = model.invisibleRootItem(); 
    for (int i = 0; i < 4; ++i) { 
     QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); 
     for (int j = 0; j < 5; ++j) { 
      item->appendRow(new QStandardItem(QString("item %0%1").arg(i).arg(j))); 
     } 
     parentItem->appendRow(item); 
     parentItem = item; 
    } 
forEach(&model);