Seite 1 von 1

[gelöst] QSortFilterProxyModel items ausblenden

Verfasst: 28. September 2007 15:51
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

Verfasst: 29. September 2007 12:55
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!

Verfasst: 1. Oktober 2007 10:48
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

so gehts:

Verfasst: 1. Oktober 2007 12:13
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