Pull to refresh

Comments 13

У вас были какие-то проблемы с производительностью, что понадобилось кэширование?
Если меняется так много данных, может стоит использовать beginResetModel()?
Такая схема мне понадобилась потому что мои данные часто обновляются извне (не через View) и моя структура не может отправлять данные об изменении (она не знает об QAbstractItemModel и индексах). А beginResetModel() не может быть мне другом — мне нужно, чтобы все выделенные и раскрытые узлы модели вместе с полосами прокрутки остались на месте. Данные у меня меняются зачастую немного, но иногда очень значительно и хочется, чтобы для небольших изменений программа была дружелюбна к пользователю.
Помимо этого удобство этого адаптера заключается в том, что при его использовании не нужно тянуть никакую логику по обновлению древовидной модели через beginInsertRows/endInsertRows, beginRemoveRows/endRemoveRows рискуя потратить кучу времени на отладку — теперь вместо этого можно сделать beginUpdate() / endUpdate() и всё это сделается автоматом без лишней головной боли и с минимальным оверхедом
На самом деле обработка сигналов roswInserted/RowsDeleted не то чтобы дорогая во view, потому что view не начинает все перерисовывать, а откладывает обновление на некоторый промежуток времени, так что если идет большой поток изменений, то перерисовано окно будет всего один раз. Так что я не уверен, что такой подход даст большой выигрыш в производительности, если вообще даст.

Но вообще подход имеет место, в случае если таким образом удобно делать мост с «настоящей» моделью, хотя предпочтительнее все же заставить вашу структуру смочь отправлять данные об изменении, пусть она и не знает при этом ничего об индексах.
Согласен, но иногда эти изменения могут иметь значения, если обновлений достаточно много, т.к. rowsInserted/RowsDeleted каждый раз обновляют весь список QPersistenIndex-ов на модель. И если у меня будет десяток тысяч обновлений внутри скрытого узла, то это добавит лишнюю, хоть и незначительную задержку (у меня так происходит во время работы пользовательских скриптов). В моем же случае если все эти изменения происходят внутри скрытого узла — то модель не получит ни единого обновления.
зато если пользователь предварительно хотя бы раз развернет все узлы, то ваш подход, как я понял, будет серьезно тормозить. А количество QPersistenIndex-ов не велико обычно — только выделение же. Обычно это 1 индекс, если можно выделять несколько — то с десяток. Редко больше.
если в дереве мало изменений, то синхронизация отработает быстро даже для сравнительно большого дерева, ну а если изменений много, то тут уж ничего не поделаешь
разве вам не нужно пройтись по всему загруженному дереву, чтобы проверить, что изменилось? И еще я не понял, как dataСhanged обрабатывается
нужно, но сколько бы ни было изменений сравнение пройдет лишь раз по дереву. В моем случае, при количестве узлов в пределах 20-30 тысяч это происходит очень быстро. А изменение данных происходит через emit dataChanged(QModelIndex(), QModelIndex()); по окончанию синхронизации
количество выделенных элементов (а следовательно QPersistentIndex-ов) у меня может быть очень значительно — сотня-другая элементов запросто, а то и под тысячу. Я нас конструкторская программа и пользователь может на 3d модели выделять для редактирования значительное количество элементов и выделенные элементы должны быть выделенными и в дереве
Когда переключаешься на Qt с, например .NET и WPF, то модели вызывают, наверное, больше всего вопросов. Вот есть у нас объекты с данными и есть контролы которые их отображают. Необходимость каждый раз создавать еще и специального посредника между ними — раздражает. Подход когда данные реализуют интерфейсы для уведомления о своем изменении (типа INotifyPropertyChanged и INotifyCollectionChanged), а контрол посредством биндингов привязывается напрямую к свойствам объектов данных кажется более удачным.
В QtQuick простые модели можно описывать просто как QQmlPropertyList и кидать сигналы, что список изменился, объекты же кидают сигналы об изменении своих свойств. Но в случае сложных древовидных структур это уже работает не так оптимально и желательно делать наследника QAbstractItemModel.
Sign up to leave a comment.

Articles