Vermeiden Sie redundante Aufrufe von QSortFilterProxyModel :: filterAcceptsRow (), wenn der Filter enger geworden ist

Ist der Filter in einem QSortFilterProxyModel in irgendeiner Weise ungültig, zeigt jedoch an, dass der Filter so eingegrenzt wurde, dassfilterAcceptsRow() sollte nur in den aktuell sichtbaren Zeilen aufgerufen werden?

Derzeit macht Qt das nicht. Wenn ich @ anruQSortFilterProxyModel::invalidateFilter(), und mein Filter wird von "abcd" in "abcde" geändert, eine völlig neue Zuordnung wird erstellt, undfilterAcceptsRow() wird für alle Quellzeilen aufgerufen, obwohl offensichtlich ist, dass bisher ausgeblendete Quellzeilen ausgeblendet bleiben.

Dies ist der Code aus Qt's Quellen inQSortFilterProxyModelPrivate::create_mapping() was mein überschriebenes @ aufrufilterAcceptsRow(), und es entsteht ein völlig neuesMapping und durchläuft alle Quellzeilen:

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

ch möchte nur die sichtbaren Zeilen im Mapping iterieren und @ aufrufefilterAcceptsRow() nur auf sie. Wenn eine Zeile bereits ausgeblendet istfilterAcceptsRow() sollte nicht aufgerufen werden, da wir bereits wissen, dass es false zurückgeben würde (der Filter ist strenger geworden, er wurde nicht gelockert).

Seit ich @ überschrieben hafilterAcceptsRow(), Qt kann die Art des Filters nicht kennen, aber wenn ich @ anruQSortFilterProxyModel::invalidateFilter(), Ich habe die Information darüber, ob der Filter strikt enger geworden ist, also könnte ich diese Information an Qt weitergeben, wenn es eine Möglichkeit gibt, sie zu akzeptieren.

Auf der anderen Seite, wenn ich den Filter von @ geändert haabcd zuabce, dann sollte der Filter für alle Quellzeilen aufgerufen werden, da er enger geworden ist.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage