фильтр данных QSortFilterProxyModel Class
Есть класс QSqlTableModel Class которая берет данные с sqllite db, нужно отфильтровать данные, но не через sql запрос, нужно с модели сначала вытащить условно по колонке "Цена", все цены который не меньше 44.44 и не больше 76.77, обновить модель, а потом с обновленных данных еще раз отфильтровать но уже по колонке "прирост" в диапазоне от 20 до 50, как прослойку используя QSortFilterProxyModel... Подскажите пожалуйста как реализовать такой фильтр и как он примерно будет выглядеть
Ответы (1 шт):
В первую очередь хочу отметить, что фильтрация через QSortFilterProxyModel будет работать дольше (и чем больше будет исходных данных, тем сильнее будет разница), чем если выполнять её на стороне sqlite. Причём QSqlTableModel позволяет выставить такой фильтр.
Принцип же действий приблизительно такой:
Вы должны создать свой класс, который наследуется от QSortFilterProxyModel. В нём вы должны переопределить метод filterAcceptsRow, который осуществляет отбор строк, которые будут отображаться в модели. Он должен возвращать true для тех строк, которые вас устраивают. При обновлении своего фильтра используйте invalidateRowsFilter, чтобы модель вновь отобрала строки.
Прокси модели работают так, что в них с помощью метода setSourceModel помещается исходная модель, и в дальнейшем используется уже прокси модель:
QTableView *tableView = new QTableView;
QSqlTableModel *sourceModel = new QSqlTableModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel);
tableView ->setModel(proxyModel);
Это пример из документации, куда следует обратиться для выяснения подробностей, благо она достаточно подробная.
Посмотреть пример реализации наследника QSortFilterProxyModel с различными пояснениями можно, опять же, в документации.