【发布时间】:2018-06-16 08:53:24
【问题描述】:
您好,我正在为带有子对象的对象创建一个对话框,一个带有 QlineEdit 的 QTreeview 用于过滤。当对话框最初出现时,它看起来像(no.1)
代码如下所示。我只总结了重要的部分
#These are global so can be referenced from any function. and all set
#when i initialise my diaglog.
model=QtGui.QStandardItemModel()
treeview=QtGui.QTreeview()
proxymodel=QtGui.QSortFilterProxyModel(treeview)
treeview.setmodel(proxymodel)
proxymodel.setSourceModel(model)
def initialise_treeview(self):
#This builds the treeview with a list of root nodes only
root_nodes=["Apple","Ardvark","Ankle","Bee","Bark","Bar","Carrot"]# a list of root nodes
for objects in root_nodes:
item=QtGui.QStandardItem(objects)
model.appendRow(item)
No.2 显示当用户在 LineEdit 文本框中键入时被过滤的树视图
#When a user types into the search field the Treeview gets filtered via the proxymodel
QtCore.QObject.connect(LineEdit,QtCore.Signal("TextChanged(QString)")),update_filter)
def update_filter(self,text):
#filter the model based on the text in the qlineedit
proxymodel.setFilterRegExp(LineEdit.text());
一旦用户在树形视图中选择了一个项目(第 3 位,已选择 Bar)。代码应获取所有选定项的子项,将它们添加到模型中,最后展开选定节点以显示所有子项(第 4 号)
#update_treeview function is called to add children to the selected item
QtCore.QObject.connect(treeview.selectionModel(),QtCore.Signal("currentChanged(QModelIndex,QmodelIndex)")),update_treeview)
def update_treeview(self,currentindex,previousindex):
sourcemodel_index=proxymodel.mapToSource(currentindex)
parent_item=QtGui.QStandardItem()
#get the item from the source model
parent_item=model.itemFromIndex(sourcemodel_index)
for childitem in list_of_children:
file_item=QtGui.QStandardItem(str(childitem))
model.appendRow(file_item)
treeview.expand(currentindex) #this doesn't work when proxymodel has been filtered
到目前为止,我已经完成了大部分工作。其实都是。除了树视图的扩展外,还有一些过滤。
当没有应用过滤器时我让它工作,但是一旦树视图的列表被过滤它有点命中和错过,即树视图并不总是在正确的节点处展开。
如何确保树视图在正确的索引处展开,以便在过滤文件夹列表并将文件添加到过滤列表时。如何确保树视图扩展到正确的位置。我在 windows 上使用 python 2.7,Qt 4.8。
【问题讨论】:
-
initialise treeview() 生成目录树?对我来说,我得到了一个目录列表。
-
@eyllanesc,你是对的,它获取目录列表,然后我将它们添加到模型中,并将模型附加到树视图。我的问题是第二部分。更新模型后,如何获得正确的索引以展开。
-
您的图像有点混乱,因为我希望看到
C:, D:, E:内部的目录及其子目录,例如:C:, D:, E:, Users, Desktop, ...,根据我对您的解释的理解,顶层您的 QTreeView 是目录,子项将是文件。假设以上我理解您希望您能够在单击父目录时显示该目录的子目录。我说的对吗?
标签: python pyqt pyqt4 qtreeview qsortfilterproxymodel