[gelöst] QSortFilterProxyModel items ausblenden

Alles rund um die Programmierung mit Qt
Antworten
dust2
Beiträge: 22
Registriert: 7. Juni 2007 16:16

[gelöst] QSortFilterProxyModel items ausblenden

Beitrag von dust2 »

Hallo,

ich habe ein qsql-Modell mit einem Proxymodell dran, wo ich mit einer Line-Edit-meine Filterwerte setzen kann:

das Prinzip ist ja laut Doku:
QSortFilterProxyModel can be used to hide items that don't match a certain filter

funktioniert alles prima, jetzt brauch ich es aber auch noch andersherum also: hide items that match a filter!

"Wenn Zeile in Spalte den String "xx" enthält, dann Zeile nicht im View anzeigen! Geht das irgendwie mit filterAcceptsRow?

Danke Daniel
Zuletzt geändert von dust2 am 1. Oktober 2007 12:08, insgesamt 1-mal geändert.
flare
Beiträge: 11
Registriert: 27. Januar 2007 11:43

Beitrag von flare »

Ist eigentlich nicht so schwer. Du hast ja warscheinlich schon ne Unterklasse von QSortFilterProxyModel hergestellt, dann änderst Du Deine filterAcceptsRow-Funktion in der Art, dass es halt "false" anstatt "true" zurückliefert, wenn der string übereinstimmt.

Viel Erfolg!
dust2
Beiträge: 22
Registriert: 7. Juni 2007 16:16

Beitrag von dust2 »

Ok, dann werd ich das mal versuchen, ich hab mir mal das Trolltech-Example Custom Sort/Filter Model Example angesehen,
dort ist die filterAcceptsRow() überschrieben.
Die Methode wird allerdings nirgendwo aufgerufen, macht das das ProxyModel intern?

Daniel
dust2
Beiträge: 22
Registriert: 7. Juni 2007 16:16

so gehts:

Beitrag von dust2 »

Danke Flare, hattest recht, ist eigentlich ganz einfach:

Code: Alles auswählen

void MySortFilterProxyModel::set_HideString(QString sHide)
 {
	 m_HideString=sHide;
 }


 bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow,const QModelIndex &sourceParent) const
 {
     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
     return (sourceModel()->data(index0).toString().contains(filterRegExp())
             && (!sourceModel()->data(index0).toString().contains(m_HideString)) || (m_HideString.isEmpty()) );
 }
filterAcceptsRow ruft das Proxymodell intern auf, braucht man sich nicht zu kümmern, ich war da etwas unsicher, weil ich im Netz ein Beispiel gesehen habe, wo jemand das in einer Schleife für jede Zeile durchgelaufen ist!
Danke Daniel
Antworten