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() somente neles. Se uma linha já estiver ocultafilterAcceptsRow() 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 paraabce, o filtro deve ser chamado em todas as linhas de origem, pois se tornou estritamente mais estreito.

questionAnswers(2)

yourAnswerToTheQuestion