Russian Qt Forum

Qt => Qt Quick => Тема начата: mutineer от Март 26, 2012, 00:23



Название: Expanding delegate
Отправлено: mutineer от Март 26, 2012, 00:23
Привет. Кто-нить сталкивался с ListView, у которого айтемы умеют разворачиваться/сворачиваться по клику?
Стандартный пример Expanding Delegate ListView Example не подходит, так как:
  • сворачивается только по клику на сам развернутый элемент. А надо чтобы по клику на свернутый элемент он разворачивался, а предыдущий развернутый сворачивался
  • состояние развернут/свернут хранится в самом делегате, что не подходит, так как делегат уничтожается при уходе за границы экрана

текущий рабочий вариант - проперти expandedIndex у листа, и два состояния у делегата, зависящих от того, равен ли индекс самого делегата этому expandedIndex. Но этот вариант мне не очень нравится (делегат зависит от проперти листа), а другого придумать пока не могу. Может кто поможет?


Название: Re: Expanding delegate
Отправлено: Bepec от Март 26, 2012, 07:00
Эм... Я не сильно то и углублялся в делегаты, но чем не устраивает самописная модель?
Список пар <значение, количество подэлементов> и переменная lastExpanding.

При нажатии на "плюсик/уголок/разворачиватель" сворачивать lastExpanding, и присваивать ему текущее значение, если есть подъэлементы.

offtop: Напомни пожалуйста, размер ячейки задаётся в делегате каким параметром?


Название: Re: Expanding delegate
Отправлено: mutineer от Март 26, 2012, 10:07
Хранить состояние развернут/свернут в модели? ну это не модели дело знать кто там на экране развернут, а кто свернут. К тому же, а если вьюх будет  две? получится ерунда

offtop: в qml размер делегата задается width, height самого делегата


Название: Re: Expanding delegate
Отправлено: Bepec от Март 26, 2012, 10:30
Хм. Если 2 и больше.

Не вижу простых решений, но вот моё мнение:

Если не модель должна знать о том, кто там на экране свёрнут - развёрнут, то тогда всё нужно(а точнее другого способа нет) сосредоточить в делегате. А тут большое НО. Он тоже незнает о том, кто свёрнут - развёрнут. И вью будет незнать кто свёрнут - развёрнут.

Если же пойти по примеру QTree, то там именно модель знает, кто свёрнут/развёрнут. Только тут минус, что я не интересовался механизмом разделения на несколько вью.


Название: Re: Expanding delegate
Отправлено: BRE от Март 26, 2012, 10:49
Хранить состояние развернут/свернут в модели? ну это не модели дело знать кто там на экране развернут, а кто свернут. К тому же, а если вьюх будет  две? получится ерунда
А ты заведи еще одну специализированную модель (ItemExpandedModel), по аналогии с QItemSelectionModel, которая будет хранить и управлять развернутыми группами для каждого view.


Название: Re: Expanding delegate
Отправлено: mutineer от Март 26, 2012, 11:05
Хранить состояние развернут/свернут в модели? ну это не модели дело знать кто там на экране развернут, а кто свернут. К тому же, а если вьюх будет  две? получится ерунда
А ты заведи еще одну специализированную модель (ItemExpandedModel), по аналогии с QItemSelectionModel, которая будет хранить и управлять развернутыми группами для каждого view.

Идея интересная. А как эту дополнительную модель всунуть в ListView ?


Название: Re: Expanding delegate
Отправлено: BRE от Март 26, 2012, 11:10
Идея интересная. А как эту дополнительную модель всунуть в ListView ?
Сделать свой класс-наследник от QTreeView/QListView. :)


Название: Re: Expanding delegate
Отправлено: mutineer от Март 26, 2012, 11:11
Идея интересная. А как эту дополнительную модель всунуть в ListView ?
Сделать свой класс-наследник от QTreeView. :)

А вот это уже печалька. В QML нету TreeView и писать собственную вьюху QML-ную не хотелось