Название: Восстановить состояние дерева Отправлено: trot от Февраль 11, 2011, 00:19 Чтобы восстановить предыдущее состояние дерева (какие узлы открыты, а какие закрыты) запоминаю информацию по тем узлам, которые были открыты. У меня пока есть только один вариант, как восстановить состояние дерева, это после метода setModel, пробежаться по всем QModelIndex и выполнить setExpanded для тех узлов, которые необходимо открыть. Думаю, что рекурсивный цикл по всем QModelIndex слишком не эффективен, может быть существуют какие-нибудь более рациональные варианты. Подскажите пожайлуста.
Название: Re: Восстановить состояние дерева Отправлено: shirushizo от Февраль 11, 2011, 19:11 Ну рекурсивный цикл будет не по всем индексам, а только по тем, у который родитель раскрыт.
Если нет сортировок и фильтров, храни в элементе кто из его детей открыт по номеру строки. Т.е. применяешь функцию к корню - получаешь список раскрытых итемов, затем берешь поочередно потомков и используешь функцию для них. Если список пуст - выход из рекурсии. Я как-то так себе это представляю Код: class TreeItem Название: Re: Восстановить состояние дерева Отправлено: trot от Февраль 11, 2011, 23:48 Спасибо за идею.
Название: Re: Восстановить состояние дерева Отправлено: trot от Февраль 12, 2011, 12:24 Сделал несколько подругому. Суть следующая в классе TreeItem храню текущее состояние узла (открыт/закрыт).
Перед тем как выполнить действия по изменению дерева (вставить/удалить запись) запоминаем текущее состояние узлов с помощью метода match. Если пользователь захотел отменить изменения, то переустанавливаем модель в первоначальное состояние. При этом в классе TreeItem устанавливаем необходмо состояние узла. После того как модель переустановили ищем с помощью match те узлы, которые необходимо открыть. И далее открываем узлы. Все работает. Визульно нет никаких отрицательных эффектов. |