2017-01-09 15 views
1

У меня есть пользовательская древовидная модель с множеством элементов. Он имеет более 1000000 предметов на первом уровне ниже верхнего уровня. Когда я расширяю этот уровень в QTreeView, он вызывает model.hasChildren() для каждого из этих элементов, даже если элементы не видны (вам нужно прокрутить вниз, вниз, вниз ..., чтобы сделать их видимыми). Проблема в том, что моя функция hasChildren() занимает некоторое время, особенно когда вызывается миллион раз (занимает около 10 секунд - в PySide/PyQt). Мои вопросы:QTreeView вызывает QAbstractItemModel :: hasChildren() даже для невидимых элементов

1) Я понимаю, что hasChildren() вызывается для видимых элементов, потому что он должен знать, должен ли элемент расширяться (если он имеет детей) или нет. Но почему он вызван для невидимых предметов (я имею в виду те, которые не находятся внутри видимого диапазона и становятся видимыми только после прокрутки)? На мой взгляд, это должно быть вызвано только тогда, когда элемент станет видимым. Я что-то пропустил?

2) Как обойти эту проблему?

+0

Прочитайте раздел «Ленивое население данных модели» в [Подклассу подклассы модели] (https://doc.qt.io/qt-4.8/model-view-programming.html#model-subclassing-reference) ? – ekhumoro

ответ

0

Возможно, вам необходимо переопределить fetchMore/canFetchMore за pyqt docs. В основном, когда вы расширяете корневой каталог, вызывается fetchMore(), вы возвращаете только подмножество элементов данных; когда пользователь прокручивает, представление запрашивает у корня, может ли он получить больше; если он отвечает да, будет вызван fetchMore(), и ваша модель может вернуть больше элементов. Это должно приводить к вызову hasChildren() только для выбранных элементов дерева.

+0

Я попытался, но выборка данных пошагово ведет себя действительно странно. Я поднял еще один вопрос, связанный с этим: http://stackoverflow.com/questions/41684064/canfetchmore-and-fetchmore-are-not-working-as-expected –