LINUX.ORG.RU

Модель дерева с динамической подгрузкой

 ,


1

2

Пишу приложение с использованием Python, Qt5 и PySide. Делаю модель дерева с динамической подгрузкой (наследуюсь от QAbstractItemModel).

В принципе алгоритм действий прост - каждый узел по дефолту не грузит своих детей, а лишь имеет флаг loaded = False. Также мною переопределены canFetchMore (возвращает !loaded) и fetchMode (собственно, загружает данные и делает loaded = True).

Пока я не загрузил детей узла, я не знаю их количества и вообще есть ли они. Однако если rowCount возвращает ноль, то такой узел невозможно развернуть и соответственно реальные данные никогда подгружены не будут. Решение: возвращаем единицу, если loaded == False.

Теперь перед нами встаёт новая проблема. После разворачивания узла, у которого нет детей, значок с плюсиком никуда не девается (хотя rowCount уже возвращает 0 вместо 1) и это выглядит очень некрасиво.

Что делать в этом случае? Как дать QTreeView понять, что у узла нет детей на самом деле?

Пока я вижу решением только грузить на один уровень больше, чем нужно (тогда я буду знать есть дети у разворачиваемого узла или нет и никогда не буду возвращать фейковые значения). Но это как-то нерационально...

★★★★★

Последнее исправление: KivApple (всего исправлений: 1)

После разворачивания узла, у которого нет детей, значок с плюсиком никуда не девается (хотя rowCount уже возвращает 0 вместо 1) и это выглядит очень некрасиво.

А сигнал выслан об изменении данных в узле?

kamre ★★★
()
Ответ на: комментарий от kamre

А что я должен сделать?

Я пробовал делать так:

Если на самом деле узел имеет детей, то после подгрузки вызываю beginInsertRows(1, количествоДетей - 2) и endInsertRows().

А если на самом деле узел детей не имеет, то после подгрузки вызываю removeRemoveRows(0, 0) и endRemoveRows().

В первом случае всё работает нормально. При раскрытии же пустого узла приложение ведёт себя случайным образом - может всё правильно сработать (плюсик исчезает), а может упасть.

KivApple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.