Russian Qt Forum
Июня 14, 2025, 20:11
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Постепенное заполнение QTreeView из другого потока
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Постепенное заполнение QTreeView из другого потока (Прочитано 6559 раз)
Caduceus
Гость
Постепенное заполнение QTreeView из другого потока
«
:
Июня 09, 2012, 10:25 »
Есть огромная структура данных в виде дерева. И постепенно читается во втором потоке.
И все узлы дерева кладутся в модель, унаследованную от QAbstractItemModel. Когда во втором потоке узел прочитан - я шлю модели postEvent для добавления узла в дерево
Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
2) Как сделать, чтобы все узлы были по-умолчанию раскрыты?
Записан
alexis031182
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #1 :
Июня 09, 2012, 10:57 »
Цитата: Caduceus от Июня 09, 2012, 10:25
...
Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
...
По идее, из модели не нужно отсылать сигнал о необходимости перерисовки, если вновь добавленный в модель элемент выходит за границы области видимости во вьюхе.
Записан
mutineer
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #2 :
Июня 09, 2012, 11:00 »
Цитата: alexis031182 от Июня 09, 2012, 10:57
Цитата: Caduceus от Июня 09, 2012, 10:25
...
Вопросы по виду для этого дерева.
1) как сделать так, чтобы вид постепенно разрастался без тормозов в ГУИ?
...
По идее, из модели не нужно отсылать сигнал о необходимости перерисовки, если вновь добавленный в модель элемент выходит за границы области видимости во вьюхе.
Модель не в курсе что там входит в область видимости, а что нет. Это должна решать вьюха. Но модель и не высылает сигнал о перерисовке, она высылает сигнал об изменении данных. А перерисовываться или нет решает вьюха
Записан
Caduceus
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #3 :
Июня 09, 2012, 11:01 »
Модель долна слать, что она обновилась. Я так понимаю это через dataChanged делается. Но вот как сделать, чтоб все плавно было и без тормозов в ГУИ, если таких запросов много сразу и как все раскрыть?
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #4 :
Июня 09, 2012, 11:06 »
Расслабься, QTreeView просто жутко тормозной.
Записан
alexis031182
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #5 :
Июня 09, 2012, 11:09 »
Чтобы очередь не забивалась, нужно тогда притормозить поток источник. Например, чтобы отсылал новую порцию событий только после соответствующего сигнала со стороны GUI-потока. Добавление новых элементов тогда будет существенно медленнее, но зато тормозить ничего не будет.
Записан
alexis031182
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #6 :
Июня 09, 2012, 11:16 »
И вообще, зачем добавлять, например, миллион записей средствами модели, если любая вьюха, ну максимум 100 только отобразит. То есть, организуется первый пакет в 100 записей, который будет добавлен средствами модели, а остальные просто в контейнер могут пихаться.
Однако здесь есть минус: если вдруг пользователь начнёт крутить ползунок в процессе добавления новых записей в модель.
Записан
mutineer
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #7 :
Июня 09, 2012, 11:31 »
Когда мне надо было добавлять в модель много поступающих данных, то сигнал об их добавлении модель высылала не сразу при появлении одной записи, а один раз в секунду, оповещая вьюху о добавлении сразу пакета записей
Записан
Igore
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #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
Гость
Re: Постепенное заполнение QTreeView из другого потока
«
Ответ #9 :
Июня 09, 2012, 14:59 »
Цитата: Igore от Июня 09, 2012, 14:36
Используй beginInsertRows, endInsertRows, отрисовка будет без промаргивания, эти методы уведомят View о новых данных.
При частом добавлении данных вью будет очень тормозить
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...