Evite chamadas redundantes para QSortFilterProxyModel :: filterAcceptsRow () se o filtro se tornar estritamente mais estreito

Existe alguma maneira de invalidar o filtro em um QSortFilterProxyModel, mas para indicar que o filtro foi reduzido para quefilterAcceptsRow() deve ser chamado apenas nas linhas atualmente visíveis?

Atualmente, o Qt não faz isso. Quando eu ligoQSortFilterProxyModel::invalidateFilter(), e meu filtro foi alterado de "abcd" para "abcde", um mapeamento totalmente novo é criado efilterAcceptsRow() é chamado em todas as linhas de origem, mesmo que seja óbvio que as linhas de origem que estavam ocultas até agora permanecerão ocultas.

Este é o código das fontes do Qt emQSortFilterProxyModelPrivate::create_mapping() que chama meu substituídofilterAcceptsRow()e cria um novo completamenteMapping e itera sobre todas as linhas de origem:

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);
}

O que eu quero é iterar apenas as linhas visíveis no mapeamento e na chamadafilterAcceptsRow()&nbsp;somente neles. Se uma linha já estiver ocultafilterAcceptsRow()&nbsp;não deve ser chamado, porque já sabemos que ele retornaria falso (o filtro se tornou mais rigoroso, não foi solto).

Desde que eu supereifilterAcceptsRow(), Qt não pode saber a natureza do filtro, mas quando eu ligoQSortFilterProxyModel::invalidateFilter(), Tenho as informações sobre se o filtro se tornou estritamente mais estreito, para que eu possa passar essas informações para o Qt se houver uma maneira de aceitá-las.

Por outro lado, se eu mudei o filtro deabcd&nbsp;paraabce, o filtro deve ser chamado em todas as linhas de origem, pois se tornou estritamente mais estreito.