Есть ли в моем коде ошибка при заполнении QTreeView?
Вопрос
Я использую PyQt 4.4.
Лучше всего это показать с помощью нескольких фотографий.Все узлы должны иметь листья от 0 до 99.Они постепенно загружаются с помощью canFetchMore()
и fetchMore()
.Но по какой-то неизвестной мне причине это работает только для корневого узла.(Изображение 1)
Если я сверну и разверну узел, он загрузит еще 10 значений.(Изображение 2 и 3)
Также странно, что он загружает 10 значений, поскольку код загружает только 5 за вызов fetchMore()
, что означает, что он вызывается 2 раза, прежде чем код перестанет загружать дополнительные данные.
Я написал небольшой пример, чтобы продемонстрировать проблему, просто запустите его с помощью python test.py
.
http://snipt.org/lLh
Кто-нибудь знает, что вызывает эту ошибку?
Решение
Я просмотрел исходный код Qt (v4.5, хотя я не ожидаю большой разницы между v4.4 и v4.5) для QAbstractItemView и QTreeView, и я не думаю, что они поддерживают инкрементную отложенную загрузку дочерних узлов.
QAbstractItemView не имеет понятия о деревьях, поэтому он только вызывает fetchMore()
на самом верхнем индексе.Он вызывает fetchMore()
когда:
- Геометрия обновлена
- Полосы прокрутки перемещаются
- Строки вставлены
- Текущий элемент изменяется в результате операции перетаскивания с автоматической прокруткой.
QTreeView дополнительно вызывает fetchMore()
когда:
- Элемент развернут (по сути, это единственный раз, когда он вызывает
fetchMore()
с некорневым индексом) - Макет представления необходимо изменить, например, с помощью
expandAll()
иcollapseAll()
Я думаю, что лучшим решением было бы создать подкласс QTreeView, чтобы он вызывал fetchMore()
в соответствующих местах и с соответствующими индексами.