2010-07-20 8 views
10

Domanda: come trovare l'elemento secondario, in un modello QAbstractItemModel caricato QAbstractItemModel con il metodo model->match()?Come trovare i sottitem in QAbstractItemModel e la classe QTreeView?

Problema: model->match() non è in grado di trovare elementi secondari, wtf ?!

Ecco l'esempio:

alt text http://www.freeimagehosting.net/uploads/179eee87e3.png

Come si può vedere dalla foto, che sto cercando di ampliare Layouts voce secondaria con questo codice:

void Dialog::restoreState(void) 
{ 
    // get list 
    QSettings settings("settings.ini", QSettings::IniFormat); 
    settings.beginGroup("MainWindow"); 
    QStringList List = settings.value("ExpandedItems").toStringList(); 
    settings.endGroup(); 

    foreach (QString item, List) 
    { 
     if (item.contains('|')) 
      item = item.split('|').last(); 
     // search `item` text in model 
     QModelIndexList Items = model->match(model->index(0, 0), Qt::DisplayRole, QVariant::fromValue(item)); 
     if (!Items.isEmpty()) 
     { 
      // Information: with this code, expands ONLY first level in QTreeView 
      view->setExpanded(Items.first(), true); 
     } 
    } 
} 

Dove settings.ini di file contiene :

[MainWindow] 
ExpandedItems=Using Containers, Connection Editing Mode, Form Editing Mode, Form Editing Mode|Layouts 

PS: gli oggetti radice si espandono correttamente all'avvio!

+0

Se si utilizza il proprio modello di oggetto, si può semplicemente reimplementare metodo match per soddisfare le vostre esigenze (come docs dice) –

+0

@Kamil Klimek Per esempio, ho comprare una macchina, perché devo installare il quinto ruota, se la macchina potesse girare solo con quattro ruote? L'altra domanda, se questo metodo funziona davvero come dicono i documenti ... – mosg

+0

Beh, dato che non c'è nulla nel metodo di corrispondenza è ricorsivo, non è così, perché è implementato in QAbstractItemModel, la strega non sa nulla di nessun albero (o altro) gerarchia. Questo è il motivo per cui devi reimplementare il metodo match se vuoi renderlo ricorsivo. –

risposta

17

ecco la soluzione:

QModelIndexList Items = model->match(
      model->index(0, 0), 
      Qt::DisplayRole, 
      QVariant::fromValue(item), 
      2, // look * 
      Qt::MatchRecursive); // look * 
  • * Senza quella funzione match argomento() cerca solo 1 livello
0

Il mio esempio lavorare su QTreeView.

QModelIndexList Indexes = this->ui->treeView->selectionModel()->selectedIndexes(); 
if(Indexes.count() > 0) 
{ 
    QStandardItemModel *am = (QStandardItemModel*)this->ui->treeView->model(); 

    QStack<QModelIndex> mis; 
    QModelIndex mi = Indexes.at(0); 
    while(mi.isValid()) 
    { 
     mis.push(mi); 
     mi = mi.parent(); 
    } 

    QStandardItem *si; 
    bool FirstTime = true; 
    while (!mis.isEmpty()) 
    { 
     mi = mis.pop(); 
     if(FirstTime) 
     { 
      FirstTime = false; 
      si = am->item(mi.row()); 
     } 
     else 
     { 
      si = si->child(mi.row()); 
     } 
    } 
    // "si" - is selected item 
} 
Problemi correlati