2017-10-21 2 views
0

Ich möchte eine Frage, die ich zuvor mit einem Filter gestellt habe, erweitern. In meinem previous question ich Hilfe in verzögertes Laden bekam die treeview, Eltern erste und einzige der Eltern Kinder hinzugefügt, wenn der Benutzer auf dem Knoten mehr Klicks oder weniger alslazy Filtern von QTreeview mit QsortFIlterProxymodel

from PyQt4 import QtGui 


class Widget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.mytreeview = QtGui.QTreeView(self) 
     self.setLayout(QtGui.QVBoxLayout()) 
     self.layout().addWidget(self.mytreeview) 
     self.model = QtGui.QStandardItemModel(self.mytreeview) 
     self.mytreeview.setModel(self.model) 
     self.mytreeview.clicked.connect(self.update_model) 
     self.initialise_model() 

    def initialise_model(self): 
     for text in ["parent1", "parent2", "parent3"]: 
      item = QtGui.QStandardItem(text) 
      self.model.appendRow(item) 

    def update_model(self, index): 
     parent = self.model.itemFromIndex(index) 
     for text in ["children1", "children2", "children3"]: 
      children = QtGui.QStandardItem("{}_{}".format(parent.text(), text)) 
      parent.appendRow(children) 
     self.mytreeview.expand(index) 

folgt Ich möchte nun erweitern und die Verwendung eines machen Filter für die Baumansicht, so dass ein Benutzer den Namen eines Elternknoten eingeben kann und die Baumansicht sich selbst auf die entsprechenden relevanten Knoten herunterfiltert. Ich möchte immer noch die Fähigkeit für den Benutzer, auf einen übergeordneten Knoten zu klicken, und selbst wenn gefiltert nur dann würden die untergeordneten Knoten zum übergeordneten hinzugefügt werden.

Wie kann ich Folgendes anpassen, um dies zu tun? Ich habe die treeview eingerichtet wie folgt

proxyModel = QSortFilterProxyModel(treeView) 
proxyModel.setSourceModel(self.model) 

# set model 
treeView.setModel(proxyModel); 
treeView.setSortingEnabled(true) 

def update_model(self, index): 
    parent = self.model.itemFromIndex(index) 
    ##not sure about this now in the light of the proxyModel 
    for text in ["children1", "children2", "children3"]: 
     children = QtGui.QStandardItem("{}_{}".format(parent.text(), text)) 
     parent.appendRow(children) 
    self.mytreeview.expand(index)#not sure about this either as the index is of the proxyModel 

Ich habe zwei Hauptfragen zunächst die proxyModel Index und die Quelle Modellindex, ich bin nicht sicher, wie das funktioniert und auch wenn auf dem Knoten der angeklickt Expandieren,

Antwort

0

Die Klassen, die von QAbstractProxyModel als QSortFilterProxyModel erben, verfügen über die mapToSource()-Methode, die den Index des Quellmodells über den Index des Proxy-Modells zurückgibt. Außerdem gibt es eine andere Methode mit der Bezeichnung mapFromSource(), die die umgekehrte Methode verwendet, damit Sie die Methode hinzufügen können Artikel zum richtigen Modell.

Um die Daten zu filtern, habe ich eine QLineEdit hinzugefügt, wo das textChanged Signal verbunden ist, der Text, der das Signal liefert, das wir für den Filter verwendet haben.

class Widget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.filterLe = QtGui.QLineEdit(self) 
     self.mytreeview = QtGui.QTreeView(self) 
     self.setLayout(QtGui.QVBoxLayout()) 
     self.layout().addWidget(self.filterLe) 
     self.layout().addWidget(self.mytreeview) 
     self.model = QtGui.QStandardItemModel(self.mytreeview) 

     self.proxyModel = QtGui.QSortFilterProxyModel(self.mytreeview) 
     self.proxyModel.setSourceModel(self.model) 
     self.mytreeview.setSortingEnabled(True) 

     # set model 
     self.mytreeview.setModel(self.proxyModel) 
     self.mytreeview.clicked.connect(self.update_model) 
     self.filterLe.textChanged.connect(self.onTextChanged) 
     self.initialise_model() 

    @QtCore.pyqtSlot(str) 
    def onTextChanged(self, text): 
     self.proxyModel.setFilterRegExp(text) 

    def initialise_model(self): 
     for text in ["parent1", "parent2", "parent3"]: 
      item = QtGui.QStandardItem(text) 
      self.model.appendRow(item) 

    def update_model(self, index): 
     ix = self.proxyModel.mapToSource(index) 
     parent = self.model.itemFromIndex(ix) 
     for text in ["children1", "children2", "children3"]: 
      children = QtGui.QStandardItem("{}_{}".format(parent.text(), text)) 
      parent.appendRow(children) 
     self.mytreeview.expand(index) 
Verwandte Themen