Название: Постепенное заполнение 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 о новых данных. При частом добавлении данных вью будет очень тормозить |