使用 QsortFIlterProxymodel 延迟过滤 QTreeview
lazy Filtering QTreeview with QsortFIlterProxymodel
我想用过滤器扩展我之前提出的问题。在我的
我在延迟加载树视图方面得到了帮助,首先 parents 并且仅在用户或多或少单击节点时才添加 parent 的 children,如下所示
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)
我现在想扩展并使用树视图的过滤器,以便用户可以键入 parent 节点的名称,树视图将自行过滤到适当的相关节点。我仍然希望保留用户单击 parent 节点的能力,即使只有在过滤时才会将 child 节点添加到 parent.
我如何调整以下内容来做到这一点?我已将树视图设置如下
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()
方法,即returns源模型的索引传递代理模型,还有另一种称为 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)
我想用过滤器扩展我之前提出的问题。在我的
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)
我现在想扩展并使用树视图的过滤器,以便用户可以键入 parent 节点的名称,树视图将自行过滤到适当的相关节点。我仍然希望保留用户单击 parent 节点的能力,即使只有在过滤时才会将 child 节点添加到 parent.
我如何调整以下内容来做到这一点?我已将树视图设置如下
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()
方法,即returns源模型的索引传递代理模型,还有另一种称为 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)