Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Caduceus от Июня 09, 2012, 10:25



Название: Постепенное заполнение QTreeView из другого потока
Отправлено: Caduceus от Июня 09, 2012, 10:25
Есть огромная структура данных в виде дерева. И постепенно читается во втором потоке.
И все узлы дерева кладутся в модель, унаследованную от QAbstractItemModel. Когда во втором потоке узел прочитан - я шлю модели postEvent для добавления узла в дерево

Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
2) Как сделать, чтобы все узлы были по-умолчанию раскрыты?


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: alexis031182 от Июня 09, 2012, 10:57
...
Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
...
По идее, из модели не нужно отсылать сигнал о необходимости перерисовки, если вновь добавленный в модель элемент выходит за границы области видимости во вьюхе.


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: mutineer от Июня 09, 2012, 11:00
...
Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
...
По идее, из модели не нужно отсылать сигнал о необходимости перерисовки, если вновь добавленный в модель элемент выходит за границы области видимости во вьюхе.

Модель не в курсе что там входит в область видимости, а что нет. Это должна решать вьюха. Но модель и не высылает сигнал о перерисовке, она высылает сигнал об изменении данных. А перерисовываться или нет решает вьюха


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: Caduceus от Июня 09, 2012, 11:01
Модель долна слать, что она обновилась. Я так понимаю это через dataChanged делается. Но вот как сделать, чтоб все плавно было и без тормозов в ГУИ, если таких запросов много сразу и как все раскрыть?



Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: Авварон от Июня 09, 2012, 11:06
Расслабься, QTreeView просто жутко тормозной.


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: alexis031182 от Июня 09, 2012, 11:09
Чтобы очередь не забивалась, нужно тогда притормозить поток источник. Например, чтобы отсылал новую порцию событий только после соответствующего сигнала со стороны GUI-потока. Добавление новых элементов тогда будет существенно медленнее, но зато тормозить ничего не будет.


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: alexis031182 от Июня 09, 2012, 11:16
И вообще, зачем добавлять, например, миллион записей средствами модели, если любая вьюха, ну максимум 100 только отобразит. То есть, организуется первый пакет в 100 записей, который будет добавлен средствами модели, а остальные просто в контейнер могут пихаться.

Однако здесь есть минус: если вдруг пользователь начнёт крутить ползунок в процессе добавления новых записей в модель.


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: mutineer от Июня 09, 2012, 11:31
Когда мне надо было добавлять в модель много поступающих данных, то сигнал об их добавлении модель высылала не сразу при появлении одной записи, а один раз в секунду, оповещая вьюху о добавлении сразу пакета записей


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: Igore от Июня 09, 2012, 14:36
Используй beginInsertRows, endInsertRows, отрисовка будет без промаргивания, эти методы уведомят View о новых данных. А вот с раскрытием проблема, за это отвечает View::setExpanded.
Можно View::expandAll, на каждое изменение, но наверное не очень подойдет.

Можно попытаться самому
Model:signal(QModelIndex added_items)
View:slot(QModelIndex added_items) и внутри setExpanded
P.S. setExpanded делает развернутым только этот узел, дочерние узлы остаются в прежнем состоянии.


Название: Re: Постепенное заполнение QTreeView из другого потока
Отправлено: mutineer от Июня 09, 2012, 14:59
Используй beginInsertRows, endInsertRows, отрисовка будет без промаргивания, эти методы уведомят View о новых данных.

При частом добавлении данных вью будет очень тормозить