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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать чтобы дерово в QTreeView не сворачивалось  (Прочитано 7805 раз)
dr_Begemot
Гость
« : Апрель 15, 2009, 15:42 »

Есть QTreeView с работающей моделью, в узлах дерева стоят подписи. В некоторых случаях программа изменяет стоку в подписи, при этом дерево сворачивается.

Как сделать так, чтобы дерево не сворачивалось, а оставалось в таком же состоянии, в каком его раскрыл пользователь и только изменялась строка в нужном узле?
Записан
EhTemka
Гость
« Ответ #1 : Апрель 15, 2009, 20:14 »

Подпись - это текст в ячейке?

Версия Qt какая?

У меня 4.5.0. Дерево, при изменении данных в модели не сворачивается. (да и в предыдущих не сворачивалась, может что-то с реализацией модели?)
Записан
kirill
Гость
« Ответ #2 : Апрель 16, 2009, 05:43 »

Там скорее всего все дерево загружается заново при изменении одной лишь надписи.
Записан
drsm
Гость
« Ответ #3 : Апрель 16, 2009, 09:30 »

там скорее всего вызывается, при изменении, model->reset(),
вместо emit layoutChanged().
Записан
dr_Begemot
Гость
« Ответ #4 : Апрель 16, 2009, 11:54 »

там скорее всего вызывается, при изменении, model->reset(),
вместо emit layoutChanged().

Да-да, именно так)
Записан
dr_Begemot
Гость
« Ответ #5 : Апрель 16, 2009, 12:03 »

там скорее всего вызывается, при изменении, model->reset(),
вместо emit layoutChanged().

гм... итак, при изменении текста вызывать emit layoutChanged(), при добавлении узла то же самое (проверил, работает), а вот при удалении выбранного узла со всеми его потомками нужен именно reset()?
у меня, если я при удалении вызываю emit layoutChanged() приложение завершается ошибкой...
Записан
drsm
Гость
« Ответ #6 : Апрель 16, 2009, 12:46 »

есть у модели так называемый persistentIndexList() который хранит закешированные вьюхами или кем-то еще индексы модели.
если добавлять/удалять элементы используя begin/endInsertRows() и begin/endRemoveRows(), то данный список пересчитывается автоматически и сигналы эмитятся тоже.

если невозможно использовать эти функции то алгоритм такой:
1. emit layoutAboutToBeChanged();
2. сохранить данные по индексам из persistentIndexList()
3. добавить/удалить элементы
4. пересчитать индексы в persistentIndexList() используя данные из 2. см changePersistentIndex()
5. emit layoutChanged();

Записан
johnny
Гость
« Ответ #7 : Май 06, 2009, 15:41 »

если невозможно использовать эти функции то алгоритм такой:
...

Громадное спасибо за подробные разъяснения, из доки лично я этого нифига не понял.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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