QTableView, QAbstractTableModel und eine Suche

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo, ich habe ein QTableView Widget, welches ich über das QAbstractTableModel "befülle".
Nun möchte ich über dem TableView ein kleines Textfeld als Suche einbringen. Sobald man also etwas in dieses Textfeld eingibt soll er nur noch die Einträge in der Tabelle anzeigen, in denen das gesucht enthalten ist.
Ich hab schon einiges gesucht, aber habe noch keine Lösung für mich gefunden bzw. nicht alles verstanden. Am besten umsetzen kann man das wohl mit dem QSortFilterProxyModel - aber wie? Ich habe diese Klasse noch nie genutzt...

Würde mich über Hilfe freuen ...
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Es hat geklappt. Vielmehr kann ich dazu auch nicht sagen, weil das Beispiel schon alles sagt =)
Vielen Dank!
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hey Lunar, jetzt bin ich doch noch auf ein Problem gestoßen. Und zwar habe ich eine Funktion in meinem TableModel eingebaut, auf die ich gerne zugreifen würde. Seitdem ich den Filter eingebaut habe, funktioniert sie nicht.
Wenn ich beim Aufruf dieser Funktion auf das sourceModel verweise funktioniert die Funktion, aber ich übergebe den falschen Index, da ich diesen von dem gefilterten TableModel bekommen habe.

Code: Alles auswählen

self.model.datas(index, role=QtCore.Qt.DisplayRole)
Wenn ich aber auf das "gefilterte" TableModel verweise, kommt die Fehlermeldung, dass die Funktion in der Klasse nicht enthalten ist:

Code: Alles auswählen

self.proxy.datas(index, role=QtCore.Qt.DisplayRole)
Ich hoffe ich habe das Problem verständlich beschrieben.
lunar

@Trubinial: Und wofür brauchst Du eine ".datas()"-Methode?! Nutze doch einfach ".data()".
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Naja, während mir die .data() Funktion nur den Eintrag aus einer Zelle zurückgibt, gibt mir meine .data() Funktion die Einträge der ganzen Zeile zurück ... Ich weiß die benennung der Funktion .datas() is nen bisle unglücklich gewählt ...
lunar

@Trubinial Guru: Um die Daten einer ganzen Zeile abzufragen, kannst Du auch eine Funktion schreiben, welche das Model als Argument erhält. Ansonsten musst Du eben von QSortFilterProxyModel ableiten, und ".datas()" in der abgeleiteten Klasse implementieren.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Nachdem ich das nicht so recht hinbekommen habe, bin ich jetzt auf eine extrem einfache Lösung gestoßen, die bei mir jedenfalls vollkommen ausreicht. Ich schicke einfach den index für jede Spalte der ausgewählten Zeile durch die data() Methode:

Code: Alles auswählen

zeile= []
for spalte in range(6):
            zeile.append(unicode(tablemodel.data(tablemodel.index(int(index.row()), spalte), role=QtCore.Qt.DisplayRole).toString()))
"zeile" enthäldt dann die Einträge der gesamten Zeile. Das ist äußerst faul gelöst, aber es funktioniert =)
Antworten