Chained QSortFilterProxyModels

Sagen wir, ich habe eine Liste Variable datalist speichern 10.000 Zeichenfolgen Einheiten. Das QTableView muss nur einige dieser Entitäten anzeigen. Aus diesem QTableView wurde QSortFilterProxyModel QTableView zugewiesen, das die gesamte Filterung durchführt. Nachdem alle Proxy-Arbeiten abgeschlossen QTableView empfängt die QTableView "25 Entitäten, um anzuzeigen (so wurden 9.975 Entitäten" herausgefiltert ".

Nun schaffe ich ein QLineEdit , das als Suchfeld verwendet werden soll, wo der Benutzer ein Schlüsselwort QLineEdit kann, um die Liste der angezeigten 25 Entitäten (Items) noch weiter QLineEdit . Zu diesem Zweck verknüpfe QLineEdit das textChanged Signal von QLineEdit, das der filterAcceptsRow() -Methode von QTableView Proxy filterAcceptsRow() .

Das Problem, das ich hier sehe, ist, dass Proxy-Modell muss wieder auf die ursprüngliche 10.000 Entitäten lange Liste wieder zu filtern. Und wieder. Und wieder.

Ich frage mich, ob es möglich ist, einen zweiten Proxy zu erstellen, der abholen würde, was der erste Proxy bereits herausgefiltert hat: 25 Entitäten statt 10.000.

So würde das resultierende Schema so aussehen:

datalist > QAbstractTableModel > QSortFilterProxyModel > QSortFilterProxyModel > QTableView

Woher:

datalist ist 10.000 datalist lange liste variabel.

QAbstractTableModel ist ein Basisdatenmodell

QSortFilterProxyModel ist ein erstes Proxy-Modell, das den dreckigsten und langsamsten QSortFilterProxyModel macht

QSortFilterProxyModel ist ein zweites Proxy-Modell, das an einem vor-gefilterten ersten Proxy-Daten arbeitet (es wird verwendet, um nach dem Schlüsselwort des Benutzers zu filtern).

QTableView ist ein QTableView selbst, das verwendet wird, um die Entity Items anzuzeigen.

Also, die Frage ist: Ist es eine gültige Idee?

One Solution collect form web for “Chained QSortFilterProxyModels”

Der folgende Code verwendet zwei ProxyModels, die 10.000 Artikel filtern. Es klappt… Bildbeschreibung hier eingeben

 from PyQt4.QtCore import * from PyQt4.QtGui import * import sys class MyTableModel(QAbstractTableModel): def __init__(self, parent=None, *args): QAbstractTableModel.__init__(self, parent, *args) self.items = [i for i in range(10000)] def rowCount(self, parent): return len(self.items) def columnCount(self, parent): return 1 def data(self, index, role): if not index.isValid(): return QVariant() elif role != Qt.DisplayRole: return QVariant() row=index.row() column=index.column() if row<len(self.items): return QVariant(self.items[row]) else: return QVariant() class Proxy01(QSortFilterProxyModel): def __init__(self): super(Proxy01, self).__init__() def filterAcceptsRow(self, row, parent): sourceModel=self.sourceModel() index=sourceModel.index(row, 0, parent) name=sourceModel.data(index, Qt.DisplayRole).toString() if name and not int(name)%10: return True return False class Proxy02(QSortFilterProxyModel): def __init__(self): super(Proxy02, self).__init__() self.keyword=None def setKeyword(self, arg): if arg: self.keyword=str(arg) self.reset() def filterAcceptsRow(self, row, parent): sourceModel=self.sourceModel().sourceModel() index=sourceModel.index(row, 0, parent) name=sourceModel.data(index, Qt.DisplayRole).toString() if self.keyword and name and not self.keyword.lower() in str(name).lower(): return False return True class MyWindow(QWidget): def __init__(self, *args): QWidget.__init__(self, *args) self.tablemodel=MyTableModel(self) self.proxy1=Proxy01() self.proxy1.setSourceModel(self.tablemodel) self.proxy2=Proxy02() self.proxy2.setSourceModel(self.proxy1) tableviewA=QTableView() tableviewA.setModel(self.proxy2) searchEdit=QLineEdit() searchEdit.textChanged.connect(self.proxy2.setKeyword) layout = QVBoxLayout(self) layout.addWidget(tableviewA) layout.addWidget(searchEdit) self.setLayout(layout) def test(self, arg): print arg if __name__ == "__main__": app = QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.exec_()) 

Hier ist ein einziger Proxy-Ansatz. Suche nach Stichwort ist bemerkenswert langsamer vs zwei Proxys Umsetzung:

 from PyQt4.QtCore import * from PyQt4.QtGui import * import sys class MyTableModel(QAbstractTableModel): def __init__(self, parent=None, *args): QAbstractTableModel.__init__(self, parent, *args) self.items = [i for i in range(10000)] def rowCount(self, parent): return len(self.items) def columnCount(self, parent): return 1 def data(self, index, role): if not index.isValid(): return QVariant() elif role != Qt.DisplayRole: return QVariant() row=index.row() column=index.column() if row<len(self.items): return QVariant(self.items[row]) else: return QVariant() class Proxy01(QSortFilterProxyModel): def __init__(self): super(Proxy01, self).__init__() self.keyword=None def setKeyword(self, arg): if arg: self.keyword=str(arg) self.reset() def filterAcceptsRow(self, row, parent): sourceModel=self.sourceModel() index=sourceModel.index(row, 0, parent) name=sourceModel.data(index, Qt.DisplayRole).toString() if self.keyword and name and not self.keyword.lower() in str(name).lower(): return False return True class MyWindow(QWidget): def __init__(self, *args): QWidget.__init__(self, *args) self.tablemodel=MyTableModel(self) self.proxy1=Proxy01() self.proxy1.setSourceModel(self.tablemodel) tableviewA=QTableView() tableviewA.setModel(self.proxy1) searchEdit=QLineEdit() searchEdit.textChanged.connect(self.proxy1.setKeyword) layout = QVBoxLayout(self) layout.addWidget(tableviewA) layout.addWidget(searchEdit) self.setLayout(layout) def test(self, arg): print arg if __name__ == "__main__": app = QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.exec_()) 
  • Screenshot von externen Fenster in Windows in Python
  • Qt: Ist es möglich, PreviewWidget in QColumnView auszuschalten?
  • Wie man Artikel in Qt QListview mit Qt.UserRole sortiert
  • Erstellen und Färben neuer Konstrukte auf einem vorhandenen Scintilla lexer
  • Qt Tooltip wie zu verhindern, dass der Text nach der eingebauten Verzögerung verschwindet?
  • QThread Signale / Slots zu QProcesses
  • PyQt - So setzen Sie QComboBox in einer Tabellenansicht mit QItemDelegate
  • Abgeleitete Klassen empfangen Signale in falschem Thread in PySide (Qt / PyQt)
  • Problem beim Versuchen, pyside-Objekt zu kopieren
  • Qt und Kontextmenü
  • Fataler Python-Fehler: Segmentierungsfehler für PyQt ui
  • Python ist die beste Programmiersprache der Welt.