Russian Qt Forum
Июня 14, 2025, 19:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Постепенное заполнение QTreeView из другого потока  (Прочитано 6556 раз)
Caduceus
Гость
« : Июня 09, 2012, 10:25 »

Есть огромная структура данных в виде дерева. И постепенно читается во втором потоке.
И все узлы дерева кладутся в модель, унаследованную от QAbstractItemModel. Когда во втором потоке узел прочитан - я шлю модели postEvent для добавления узла в дерево

Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
2) Как сделать, чтобы все узлы были по-умолчанию раскрыты?
Записан
alexis031182
Гость
« Ответ #1 : Июня 09, 2012, 10:57 »

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

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

Модель не в курсе что там входит в область видимости, а что нет. Это должна решать вьюха. Но модель и не высылает сигнал о перерисовке, она высылает сигнал об изменении данных. А перерисовываться или нет решает вьюха
Записан
Caduceus
Гость
« Ответ #3 : Июня 09, 2012, 11:01 »

Модель долна слать, что она обновилась. Я так понимаю это через dataChanged делается. Но вот как сделать, чтоб все плавно было и без тормозов в ГУИ, если таких запросов много сразу и как все раскрыть?

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июня 09, 2012, 11:06 »

Расслабься, QTreeView просто жутко тормозной.
Записан
alexis031182
Гость
« Ответ #5 : Июня 09, 2012, 11:09 »

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

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

Однако здесь есть минус: если вдруг пользователь начнёт крутить ползунок в процессе добавления новых записей в модель.
Записан
mutineer
Гость
« Ответ #7 : Июня 09, 2012, 11:31 »

Когда мне надо было добавлять в модель много поступающих данных, то сигнал об их добавлении модель высылала не сразу при появлении одной записи, а один раз в секунду, оповещая вьюху о добавлении сразу пакета записей
Записан
Igore
Гость
« Ответ #8 : Июня 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 делает развернутым только этот узел, дочерние узлы остаются в прежнем состоянии.
« Последнее редактирование: Июня 09, 2012, 14:57 от Igore » Записан
mutineer
Гость
« Ответ #9 : Июня 09, 2012, 14:59 »

Используй beginInsertRows, endInsertRows, отрисовка будет без промаргивания, эти методы уведомят View о новых данных.

При частом добавлении данных вью будет очень тормозить
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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