#cpp #qt #qt5 #qml
Приветствую!
Ситуация следующая:
Есть моделька, основанная на QAbstractItemModel, так как данных достаточно много,
получаю их с помощью предназначенного для этого canFetchMore и fetchMore
и когда просто модель отображается в ListView (qml), всё замечательно, данные подгружаются
по мере пролистывания.
Теперь на эту модельку сверху вешаю прокси, на основе QSortFilterProxyModel
в ней для теста отбираю строки (переопределив filterAcceptsRow) по какому нибудь
полю, не важно.
Дальше начинаются проблемы.
При установленной фильтрации во вьюшке выводятся не все возможные значения!
т.е. выводятся только загруженные в fetchMore в данный момент.
Т.е. в fetchMore гружу по 100 записей, не выводятся ни одной, т.к. целевые значения
будут прогружены начиная с 500.
и прогрузки дальше не происходит т.к. логично, что вьюшка не считает необходимым
загружать ещё т.к. всё умещается и не надо пролистывать но и прокси моделька не считает
нужным прогрузить дальше, либо как-то сообщить основной модели - мне нужны записи с
вот такими значениями.
Подскажите, пожалуйста, как быть?
Не, я согласен, что лучше всего будет выбирать нужные значение через запрос к базе,
что бы не грузить лишнего,
но как тогда лучше сделать связь с основной моделью?
т.е. например я в fetchRow основной модели прогрузил записи от 0 до 100, в прокси
модели нужно выбирать, которые располагаются начиная с 500, ок, я говорю основной модели
- прогрузи ка записи с вот такими значенияи, если есть.
Ок, гружу.
Но возникает следующая проблема - если запись например 555 добавлена в модель, то
при скролинге вьюшки, она попросит записи с 500 по 600 и я тогда снова добавлю запись
555. т.е. получается будет дублирование.
Запоминать записи, которые грузил? что-то костылём попахивает.
Может есть красивый выход из ситуации?
Спасибо, даже за подсказки, на что смотреть!
Ответы
Ответ 1
На мой взгляд, тут может быть только три варианта для решения проблемы. Первый - самый бестолковый, если данных очень много. Предполагает, что модель-источник должна загрузить сразу все данные и не использовать fetchMore в принципе. Второе решение может быть основано на переопределении метода fetchMore() у прокси с тем условием, что будет сразу же (рекурсивно) повторять запрос на чтение новых строк из исходной модели до тех пор, пока количество строк в прокси после filterAcceptsRow() не достигнет нужного числа, либо исходная модель не прочитает все данные. Фактически, это решение почти столь же бестолковое, что и первое, так как потребуется полное считывание всех данных исходной модели при определённых условиях фильтрации. Третье решение предполагает использование фильтрации данных непосредственно в модели-источнике. Обратите внимание, что все SQL-модели из состава Qt имеют возможность фильтровать данные самостоятельно и в общем случае не нуждаются в каких-либо прокси. Если модель-источник является таблицей в БД, то имеет смысл использовать классы, специально предназначенные для работы с подобными источниками, а не заниматься наследованием абстрактной модели. Если же модель-источник не является таблицей в БД, а, например, представляет из себя некий файл, то фильтрация данных должна быть добавлена в эту исходную модель и производиться непосредственно при вызове fetchMore() с тем, чтобы выдать минимальное количество данных, соответствующих условиям фильтрации.
Комментариев нет:
Отправить комментарий