【问题标题】:lazy Filtering QTreeview with QsortFIlterProxymodel使用 QsortFIlterProxymodel 进行惰性过滤 QTreeview
【发布时间】:2018-04-02 18:25:13
【问题描述】:

我想用过滤器扩展我之前提出的问题。在我的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 索引和源模型索引,我不确定这是如何工作的,以及在展开点击的节点时,

【问题讨论】:

    标签: python pyqt pyqt4 qtreeview qsortfilterproxymodel


    【解决方案1】:

    从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)
    

    【讨论】:

    • 它是否适用于子项目?我使用相同的方法,但由于某种原因,当我在搜索字段中输入子项名称时,找不到它,但父项是可以的
    • @SergeyMaslov QSortFilterProxyModel 仅适用于父母,如果您想做递归过滤,请使用 recursiveFilteringEnabled doc.qt.io/qt-5/…,但它仅适用于 PyQt 5.10
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多