Описание классов Qt

QSortFilterProxyModel: сортировка и фильтрация без изменения исходной модели

Зачем нужна прокси-модель

QSortFilterProxyModel располагается между моделью данных и представлением. Она позволяет сортировать и фильтровать строки, не меняя исходную модель: это полезно, когда данные должны сохранять свой исходный порядок или используются несколькими представлениями.

auto *proxy = new QSortFilterProxyModel(this);
proxy->setSourceModel(sourceModel);
proxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
proxy->setFilterKeyColumn(0);
proxy->setFilterFixedString(ui->searchEdit->text());
ui->tableView->setModel(proxy);
proxy->sort(0, Qt::AscendingOrder);

При изменении текста поиска вызывайте setFilterFixedString() повторно. Если фильтр должен применяться к другой роли, задайте её через setFilterRole().

Индексы источника и прокси

Индекс из представления относится к прокси-модели. Перед изменением исходной модели его нужно преобразовать через mapToSource(); обратное преобразование выполняет mapFromSource(). Если правила сравнения нестандартны, переопределите lessThan(). Например, для чисел, хранящихся строками, сравнивайте числовые значения, иначе порядок будет лексикографическим: «100» окажется перед «20».

Прокси-модель упрощает интерфейс, но не заменяет серверную фильтрацию для очень больших наборов данных.