Russian Qt Forum
Ноябрь 23, 2024, 21:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Восстановить состояние дерева  (Прочитано 2899 раз)
trot
Гость
« : Февраль 11, 2011, 00:19 »

Чтобы восстановить предыдущее состояние дерева (какие узлы открыты, а какие закрыты) запоминаю информацию по тем узлам, которые были открыты. У меня пока есть только один вариант, как восстановить состояние дерева, это после метода setModel, пробежаться по всем QModelIndex и выполнить setExpanded для тех узлов, которые необходимо открыть. Думаю, что рекурсивный цикл по всем  QModelIndex слишком не эффективен, может быть существуют какие-нибудь более рациональные варианты. Подскажите пожайлуста.
Записан
shirushizo
Гость
« Ответ #1 : Февраль 11, 2011, 19:11 »

Ну рекурсивный цикл будет не по всем индексам, а только по тем, у который родитель раскрыт.
Если нет сортировок и фильтров,  храни в элементе кто из его детей открыт по номеру строки. Т.е. применяешь функцию к корню - получаешь список раскрытых итемов, затем берешь поочередно потомков и используешь функцию для них. Если список пуст - выход из рекурсии.

Я как-то так себе это представляю
Код:
class TreeItem
{
  TreeItem *parent;
  QVariant value;
  QList<TreeItem *> children;
  TreeItem *childAt(int row) {return children.at(row)};
  QList<int> expandedChildren;
  ...
}

QList<int> MyTreeModel::expandedChildren(const QModelIndex &index)
{
    return itemAt(index)->expandedChildren();
}

...

void MyWidget::restoreExpanding(const QModelIndex &item)
{
    for(int i=0;i<model->rowCount(item),++i)
    {
         QModelIndex index= model->index(i,0,item);
         QList<int> list = model->expandedChildren(index);
         for(int j=0;j<list.size();++j)
         {
             restoreExpanding(itemAt(index));
             view->setExpanded(index);
         }
    }
}

MyWidget::MyWidget(): ...
{
  ...
  restoreExpanding(model->rootItem());
}
Записан
trot
Гость
« Ответ #2 : Февраль 11, 2011, 23:48 »

Спасибо за идею.
Записан
trot
Гость
« Ответ #3 : Февраль 12, 2011, 12:24 »

Сделал несколько подругому. Суть следующая в классе TreeItem храню текущее состояние узла (открыт/закрыт).
Перед тем как выполнить действия по изменению дерева (вставить/удалить запись) запоминаем текущее состояние узлов с помощью метода match. Если пользователь захотел отменить изменения, то переустанавливаем модель в первоначальное состояние.
При этом в классе TreeItem устанавливаем необходмо состояние узла. После того как модель переустановили ищем с помощью match те узлы, которые необходимо открыть. И далее открываем узлы. Все работает. Визульно нет никаких отрицательных эффектов.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.