使用QsortFIlterProxymodel过滤QTreeview

时间:2017-10-21 21:47:20

标签: python pyqt pyqt4 qtreeview qsortfilterproxymodel

我想扩展一个我之前用过滤器提出的问题。在我的previous question 我在懒惰加载树视图方面得到了帮助,父母首先只在用户点击节点时添加父母的子项,如下所示

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索引和源模型索引,我不确定这是如何工作的,以及扩展点击的节点时,

1 个答案:

答案 0 :(得分:0)

QAbstractProxyModel继承为QSortFilterProxyModel的类具有mapToSource()方法,该方法返回通过代理模型索引的源模型的索引,还有另一个名为{{的方法1}}执行逆操作,因此您必须使用该方法才能将项添加到正确的模型中。

为了过滤数据,我添加了一个mapFromSource(),其中QLineEdit信号已连接,该文本提供了我们用于过滤器的信号。

textChanged