QML StackView + ListView: доступ к конкретному элементу модели?
Хочу построить навигацию в приложении полностью на StackView, при которой у меня есть две страницы: список с ListView работающий с C++ моделью унаследованной от QAbstractListModel и страница с подробной информацией. В общем более менее стандартная навигация для мобильного приложения.
Но столкнулся с проблемой - как правильно использовать модель на странице подробной информации? Вроде бы пробросить саму модель и текущий индекс внутрь легко, но дальше придётся городить огород для получения данных через доп. функции, причём эти данные затем не будут автоматически апдейтится после dataChanged.
Предполагается, что такая проблема должна решаться внутри делегата имеющего два состояния типа list и detail, но мне нужен именно StackView.
Что я пробовал:
- менял parent у делегата, но мне нужны нормальные анимации и такой подход с ними не совместим. Кроме того, после возвращения делегат не встаёт точно в прежние координаты, это особенности Flickable и тут ничего не поделать.
- делал фильтр модель на основе существующей с 1 элементом и listview. Это мне совсем не нравится ибо костыль.
- получал данные обращаясь к модели - выходит фигня как писал выше.
Не могу своим мозгом дойти до более красивого решения. Думал ещё о копировании делегата в памяти, но пока не пробовал. Также думаю над написание qml плагина, но тоже пока не брался в надежде найти готовое решение.
В идеале хотелось бы найти нечто типа standalone delegate или DetailsView которому достаточно отдать модель и индекс, а дальше обращаться к данным как в обычном делегате.
В общем, остановился на варианте с QSortFilterModel. Переопределил метод filterAcceptsRow, там фильтрую всё так, чтобы остался 1 элемент.
Затем создал новый компонент, внутри которого есть ListView с interactive = false и в него помещаю делегат и отфильтрованную модель. По тестам работает стабильно и шустро на 1000+ записей.
PS: Поправил ошибки в своём вопросе, писал с телефона в пробке, уж прошу простить тех, кому пришлось это увидеть это до правки =)