Есть ли какой-либо способ аннулировать фильтр в QSortFilterProxyModel, но чтобы указать, что фильтр был сужен, поэтому filterAcceptsRow()
следует вызывать только в видимых в настоящее время строках?
В настоящее время Qt этого не делает. Когда я вызываю QSortFilterProxyModel::invalidateFilter()
, и мой фильтр изменяется с "abcd" на "abcde", создается совершенно новое сопоставление и filterAcceptsRow()
вызывается во всех исходных строках, хотя очевидно, что строки источника, которые были скрыты, далеко не останется скрытым.
Это код из источников Qt в QSortFilterProxyModelPrivate::create_mapping()
, который вызывает мой переопределенный filterAcceptsRow()
, и он создает совершенно новый Mapping
и выполняет итерацию по всем исходным строкам:
Mapping *m = new Mapping;
int source_rows = model->rowCount(source_parent);
m->source_rows.reserve(source_rows);
for (int i = 0; i < source_rows; ++i) {
if (q->filterAcceptsRow(i, source_parent))
m->source_rows.append(i);
}
То, что я хочу, - это перебрать только видимые строки в сопоставлении и вызвать filterAcceptsRow()
только на них. Если строка уже скрыта filterAcceptsRow()
не должна вызываться на ней, потому что мы уже знаем, что она вернет false для нее (фильтр стал более строгим, он не был ослаблен).
Так как я превысил filterAcceptsRow()
, Qt не может знать природу фильтра, но когда я вызываю QSortFilterProxyModel::invalidateFilter()
, у меня есть информация о том, стал ли фильтр более узким, поэтому я мог передать эту информацию Qt, если он имеет способ принять его.
С другой стороны, если я изменил фильтр с abcd
на abce
, тогда фильтр должен быть вызван во всех исходных строках, поскольку он стал более узким.