Как найти Subitem в классе QAbstractItemModel и QTreeView? - PullRequest
11 голосов
/ 20 июля 2010

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

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

Вот пример:

альтернативный текст 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: корневые элементы успешно расширяются при запуске!

Ответы [ 2 ]

20 голосов
/ 22 июля 2010

Вот решение:

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

Мой рабочий пример на 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
}
...