Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: dr_Begemot от Апрель 15, 2009, 15:42



Название: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: dr_Begemot от Апрель 15, 2009, 15:42
Есть QTreeView с работающей моделью, в узлах дерева стоят подписи. В некоторых случаях программа изменяет стоку в подписи, при этом дерево сворачивается.

Как сделать так, чтобы дерево не сворачивалось, а оставалось в таком же состоянии, в каком его раскрыл пользователь и только изменялась строка в нужном узле?


Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: EhTemka от Апрель 15, 2009, 20:14
Подпись - это текст в ячейке?

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

У меня 4.5.0. Дерево, при изменении данных в модели не сворачивается. (да и в предыдущих не сворачивалась, может что-то с реализацией модели?)


Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: kirill от Апрель 16, 2009, 05:43
Там скорее всего все дерево загружается заново при изменении одной лишь надписи.


Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: drsm от Апрель 16, 2009, 09:30
там скорее всего вызывается, при изменении, model->reset(),
вместо emit layoutChanged().


Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: dr_Begemot от Апрель 16, 2009, 11:54
там скорее всего вызывается, при изменении, model->reset(),
вместо emit layoutChanged().

Да-да, именно так)


Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: dr_Begemot от Апрель 16, 2009, 12:03
там скорее всего вызывается, при изменении, model->reset(),
вместо emit layoutChanged().

гм... итак, при изменении текста вызывать emit layoutChanged(), при добавлении узла то же самое (проверил, работает), а вот при удалении выбранного узла со всеми его потомками нужен именно reset()?
у меня, если я при удалении вызываю emit layoutChanged() приложение завершается ошибкой...


Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: drsm от Апрель 16, 2009, 12:46
есть у модели так называемый persistentIndexList() который хранит закешированные вьюхами или кем-то еще индексы модели.
если добавлять/удалять элементы используя begin/endInsertRows() и begin/endRemoveRows(), то данный список пересчитывается автоматически и сигналы эмитятся тоже.

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



Название: Re: Как сделать чтобы дерово в QTreeView не сворачивалось
Отправлено: johnny от Май 06, 2009, 15:41
если невозможно использовать эти функции то алгоритм такой:
...

Громадное спасибо за подробные разъяснения, из доки лично я этого нифига не понял.