Допустим, у меня есть переменная списка datalist
, в которой хранится 10 000 строковых объектов. QTableView
необходимо отображать только некоторые из этих объектов. Вот почему QTableView
был назначен QSortFilterProxyModel
, который выполняет всю фильтрацию. После того, как вся работа с прокси завершена, QTableView
"получает" 25 объектов для отображения (поэтому оставшиеся 9 975 объектов были "отфильтрованы").
Теперь я создаю QLineEdit
для использования в качестве поля поиска, где пользователь может ввести ключевое слово, чтобы еще больше сузить список отображаемых 25 объектов (элементов). Для этой цели я связываю сигнал textChanged
QLineEdit
с назначенным методу filterAcceptsRow()
QTableView Proxy.
Проблема, которую я здесь вижу, заключается в том, что прокси-модели необходимо вернуться к исходному длинному списку из 10 000 сущностей для повторной фильтрации. И снова. И снова.
Интересно, можно ли создать второй прокси, который будет собирать то, что уже отфильтровал первый прокси: 25 сущностей вместо 10 000.
Таким образом, результирующая схема будет выглядеть так:
datalist
> QAbstractTableModel
> QSortFilterProxyModel
> QSortFilterProxyModel
> QTableView
Где:
datalist
— переменная длинного списка из 10 000 объектов.
QAbstractTableModel
— базовая модель данных
QSortFilterProxyModel
— первая прокси-модель, выполняющая самую грязную и медленную работу по фильтрации.
QSortFilterProxyModel
— это вторая прокси-модель, работающая с предварительно отфильтрованными данными первого прокси (используется для фильтрации по ключевому слову пользователя).
QTableView
— это сам QTableView, используемый для отображения элементов сущности.
Итак, вопрос: правильная ли это идея?
QSortFilterProxyModel.setSourceModel(model)
предполагает, что передаваемая модель является подклассомQAbstractItemModel
, аQSortFilterProxyModel
является подклассомQAbstractItemModel
, ваша идея должна по крайней мере работать без ошибок. Если вы получите ускорение, которое вы ищете, я не уверен. Определенно стоит собрать минимальный тестовый пример и попробовать! - person three_pineapples   schedule 16.01.2015