Загрузка данных в QTreeView асинхронно

У меня действительно большая древовидная структура, и я не могу загрузить все дерево в Ram на стороне клиента. Я использую QTreeView от Qt.

Я хочу динамически загружать подэлементы элемента, когда пользователь расширяет элемент.

Есть ли какой-то сигнал, который срабатывает, когда пользователь открывает элемент в дереве?

Я использую учебник Пример простой модели дерева. Когда я делаю изменения в модели, представление также должно быть обновлено. И я не хочу терять фокус, чтобы не запутать пользователей!

подэлементы дерева все еще загружаются

и через некоторое время (запрос к серверу)...

Подэлементы дерева завершены загрузкой и отображением их


person feedc0de    schedule 08.08.2015    source источник


Ответы (1)


Вам нужно реализовать подкласс QAbstractItemModel, который может обрабатывать необходимый объем данных. Когда элемент раскрывается в представлении, он вызывает QAbstractItemModel::rowCount для определения количества дочерних элементов, а затем QAbstractItemModel::flags и QAbstractItemModel::data для получения данных о дочерних элементах. Если запрошенные данные в данный момент недоступны, следует вернуть данные-заполнители (например, 1 строку, содержащую «Загрузка»), и запустить запрос. Когда данные получены, испускайте сигналы rowsAboutToBeInserted и rowsInserted, чтобы уведомить представление о новых данных (вы также должны уведомить его об удалении строки «Загрузка»). Затем представление снова вызовет методы rowCount, data и flags, и теперь ваша модель должна предоставить загруженные данные. Используйте QCache, чтобы сохранить последние данные, к которым обращались, в памяти.

person Pavel Strakhov    schedule 08.08.2015
comment
Как бы вы использовали QCache? Придется ли вам объединять строку/столбец/родительский объект в один индекс, а затем отслеживать вставку/удаление/изменения модели, чтобы поддерживать кэш в актуальном состоянии (или сбрасывать при любых изменениях)? - person TSG; 01.06.2021
comment
Работает ли этот подход для большой таблицы (не дерева)? Я думаю, что этот ответ работает только для дерева, где у каждого родителя есть небольшое количество детей. - person TSG; 01.06.2021