2010-07-20 12 views
10

Pregunta: cómo encontrar el elemento secundario, en un QTreeView modelo cargado QAbstractItemModel con el método model->match()?¿Cómo encontrar el Subtema en QAbstractItemModel y la clase QTreeView?

Problema: model->match() no se encuentran los elementos secundarios, wtf ?!

Aquí está el ejemplo:

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

Como se puede ver en la foto, estoy tratando de ampliar Layouts subelemento con este código:

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); 
     } 
    } 
} 

Dónde settings.ini archivo contiene :

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

PD: ¡los ítems raíz se expanden con éxito al inicio!

+0

Si está utilizando su propio modelo de artículo, usted podría simplemente reimplementar método match para satisfacer sus necesidades (como dice docs) –

+0

@Kamil Klimek Por ejemplo, comprar un coche, ¿por qué tengo que instalar el quinto rueda, si el carro solo pudiera correr con cuatro ruedas? La otra pregunta, si este método realmente funciona como docs dicen ... – mosg

+0

Bueno, como no hay nada sobre el método de coincidencia es recursivo, supongo que no, porque está implementado en QAbstractItemModel, que no sabe nada sobre ningún árbol (u otra) jerarquía. Es por eso que TIENES que volver a aplicar el método de coincidencia si quieres que sea recursivo. –

Respuesta

17

Aquí está la solución:

QModelIndexList Items = model->match(
      model->index(0, 0), 
      Qt::DisplayRole, 
      QVariant::fromValue(item), 
      2, // look * 
      Qt::MatchRecursive); // look * 
  • * Sin esa función de correspondencia de argumento() busca sólo el 1 nivel
0

Mi ejemplo de trabajo en 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 
} 
Cuestiones relacionadas