2015-08-08 7 views
1

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

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

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

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

sub elements of tree still loading

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

sub elements of tree finished loading and showing them

ответ

1

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

+0

Не могли бы вы добавить пример кода? –