В моем проекте мне нужно отобразить список некоторых данных, используя представление списка QML. И версия QT, которую я использую, — это QT 5.0.2. Поскольку представление полосы прокрутки недоступно в этой версии Qt, мне удалось реализовать его, следуя этому пример.
Теперь источником данных является другой компонент, который предоставляет API-интерфейсы C++ для запроса диапазона данных. А количество элементов в наборе данных может быть огромным (десятки тысяч).
Я выполнил следующие шаги для достижения моих требований:
- Я создал класс C++, который наследуется от QAbstractListModel, и я переопределил функции rowCount, data, canfetchmore и fetchmore.
- А в QML я назвал экземпляр C++ моделью.
- Всякий раз, когда вызывается функция fetchmore(), я запрашиваю следующий набор данных, используя API-интерфейсы C++, которые предоставляются другим компонентом, и добавляю их к моей модели списка.
Пока все хорошо. Но мне нужно несколько уточнений -
- Если я буду продолжать добавлять данные в свою модель списка, то в конечном итоге я буду хранить в списке тысячи элементов (я не хочу этого делать). Я хочу ограничить количество элементов в списке и использовать его как кольцевой буфер. Это возможно?
- Параметр QModelIndex в fetchmore получен как недопустимый индекс. Почему?
- Предположим случай: алфавиты упоминаются на полосе прокрутки, и когда пользователь выбирает Y на полосе прокрутки, я должен получить элементы, начинающиеся с Y. Здесь я могу получить данные из моего внешнего компонента и сбросить модель списка с новыми данными. Но если я это сделаю, то мой список будет начинаться с Y-элементов, и я не смогу прокрутить вверх, чтобы получить предыдущие элементы. -- Есть ли другой способ добиться этого?
- Кроме того, мой другой компонент занимает значительное время, если я запрашиваю огромный набор данных (например, в случаях, упомянутых в пункте 3). Есть ли какие-либо предложения по улучшению дизайна для обработки этого случая?
- Есть ли способ, кроме fetchmore(), для динамического обновления модели.
Я провел много времени в Google, чтобы получить ответы на свои вопросы, и я успешно НЕ ПРОШЕЛ. :(
Любая помощь приветствуется. Заранее спасибо.