2017-10-21 238 views
0

我想擴展一個問題,我之前問過一個過濾器。在我previous question 我有幫助延遲加載樹視圖,父母第一,只增加了父母的孩子,當用戶點擊的節點上或多或少如下延遲使用QsortFIlterProxymodel過濾QTreeview

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) 

我現在想要擴展和利用的過濾器,以便用戶可以鍵入父節點的名稱,並且樹視圖將自身過濾到合適的相關節點。我仍然想保持用戶點擊父節點的能力,並且即使只有在過濾時纔會將子節點添加到父節點。

我該如何適應以下情況?我已經設置了樹狀瞭如下

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 

我首先兩個主要問題proxyModel指數和源模型指標,我不知道這是如何工作以及當擴大點擊節點,

回答

0

QAbstractProxyModel繼承爲QSortFilterProxyModel的類具有mapToSource()方法,該方法返回通過代理模型索引的源模型的索引,還有另一個稱爲mapFromSource()的方法,因此您必須使用該方法才能添加項目到正確的模型。

要過濾數據,我添加了一個QLineEdit,其中連接了textChanged信號,該信號提供我們用於過濾器的信號。

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) 
相關問題