Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用QsortFIlterProxymodel的惰性筛选QTreeview_Python_Pyqt_Pyqt4_Qtreeview_Qsortfilterproxymodel - Fatal编程技术网

Python 使用QsortFIlterProxymodel的惰性筛选QTreeview

Python 使用QsortFIlterProxymodel的惰性筛选QTreeview,python,pyqt,pyqt4,qtreeview,qsortfilterproxymodel,Python,Pyqt,Pyqt4,Qtreeview,Qsortfilterproxymodel,我想用一个过滤器来扩展我之前提出的一个问题。在我的 我在惰性加载treeview方面得到了帮助,首先是父节点,只有在用户或多或少单击节点时才添加父节点的子节点,如下所示 from PyQt4 import QtGui class Widget(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.mytreeview = Qt

我想用一个过滤器来扩展我之前提出的一个问题。在我的 我在惰性加载treeview方面得到了帮助,首先是父节点,只有在用户或多或少单击节点时才添加父节点的子节点,如下所示

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
我现在想扩展并使用treeview的过滤器,以便用户可以键入父节点的名称,treeview将自己过滤到适当的相关节点。我仍然希望用户能够单击父节点,即使在过滤后,子节点也会添加到父节点

我如何调整以下内容以实现此目的?我已经按如下方式设置了树视图

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

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

为了过滤数据,我在连接
textChanged
信号的地方添加了一个
QLineEdit
,该文本提供我们用于过滤器的信号

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)

继承自
QAbstractProxyModel
as
QSortFilterProxyModel
的类具有
mapToSource()
方法,该方法返回通过代理模型索引的源模型索引,还具有另一个名为
mapFromSource()的方法
这样做正好相反,因此您必须使用该方法才能将项目添加到正确的模型中

为了过滤数据,我在连接
textChanged
信号的地方添加了一个
QLineEdit
,该文本提供我们用于过滤器的信号

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)

它适用于子项吗?我使用相同的方法,但由于某些原因,当我在搜索字段中输入子项名称时,找不到它,但找到了父项ok@SergeyMaslovQSortFilterProxyModel仅适用于父项,如果要执行递归过滤,请使用recursiveFilteringEnabled,但它仅在PyQt 5.10中可用。它是否适用于子项?我使用相同的方法,但由于某些原因,当我在搜索字段中输入子项名称时,找不到它,但找到了父项ok@SergeyMaslovQSortFilterProxyModel仅适用于父级,如果要执行递归过滤,请使用recursiveFilteringEnabled,但它只能从PyQt 5.10中获得