2010-07-20 4 views
10

Вопрос: как найти подпункт, в QTreeView загружен QAbstractItemModel модель с model->match() метод?Как найти Subitem в классе QAbstractItemModel и QTreeView?

Задача: model->match() не может найти подпункты, wtf ?!

Вот пример:

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

Как вы можете видеть на картинке, я пытаюсь расширить Layouts подпункт с этим кодом:

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

Где settings.ini файл содержит :

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

PS: корневые элементы успешно расширяются при запуске!

+0

Если вы используете свою собственную модель элемента, можно просто переопределить метод соответствия в соответствии с вашими потребностями (как говорит Docs) –

+0

@Kamil Klimek Например, я покупаю машину, то почему я должен установить пятый колесо, если автомобиль может работать только с четырьмя колесами? Другой вопрос, если этот метод действительно работает, как говорят docs ... – mosg

+0

Ну, так как нет ничего о методе совпадения, это рекурсивный, я думаю, что это не так, потому что он реализован в QAbstractItemModel, ведьма ничего не знает о каком-либо дереве (или другой) иерархии. Вот почему вам нужно переопределить метод соответствия, если вы хотите сделать его рекурсивным. –

ответ

17

Вот решение:

QModelIndexList Items = model->match(
      model->index(0, 0), 
      Qt::DisplayRole, 
      QVariant::fromValue(item), 
      2, // look * 
      Qt::MatchRecursive); // look * 
  • * Без этой функции аргумент матча() выполняет поиск только 1-го уровня
0

Мой рабочий пример на 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 
} 
Смежные вопросы