我要做的是过滤/搜索一个使用QFileSystemModel填充它的QListView:这是我现在使用的一个test/dummy文件夹创建的一些窗口
(我正在制作一个大容量文件“重命名器”,这正是我决定学习的项目)
我想通过在“getOut”行编辑中输入一些内容来搜索/过滤列表视图。像这样的东西是我的目标(这是从一个旧的随机youtube视频但是它使用的是QListWidget
我读到QSortFilterProxyModel可能是我想要使用的,但是当我使用代理设置列表视图“setRootIndex”时,它会抛出一个错误。在
TypeError: index(self, int, int, parent: QModelIndex = QModelIndex()): argument 1 has unexpected type 'str'
所以我的问题归结为:
我可以通过使用QFileSystemModel的“setNameFilters”和“setNameFilterDisables(False)”来完成我正在尝试的工作,但是我必须以一种奇怪的方式来做,你可以在下面看到。在
def listPopulate(self):
print('\ninside the listPopulate method now')
getOut = self.getOutInputBox.text()
gList = []
gList.insert(0, getOut)
if self.homes:
if os.path.exists(self.homes):
listModel = QtWidgets.QFileSystemModel()
listModel.setFilter(QDir.NoDotAndDotDot | QDir.AllEntries | QDir.Dirs | QDir.Files)
listModel.setRootPath(self.homes)
# proxyModel = QtCore.QSortFilterProxyModel()
# proxyModel.setSourceModel(listModel)
self.mainListView.setModel(listModel)
self.mainListView.setRootIndex(listModel.index(self.homes))
if not getOut:
print('\ngetOut empty')
else:
print(getOut)
listModel.setNameFilters(gList)
listModel.setNameFilterDisables(False)
所有“gList”的东西都是因为“setNameFilters”只接受一个列表(我想这通常用于过滤文件扩展名),所以我使用getOut过滤器并将其放入一个列表中。我想用它来过滤。和'自我家园我的用户选择了路径。在
如果使用QSortFilterProxyModel正确实现了QFileSystemModel筛选,则所有问题都会得到解答。在
以下解决方案仅适用于Qt>;=5.10,因为在该版本中,我们添加了
recursiveFilteringEnabled
属性,该属性允许在树模型中进行递归过滤,如本例所示。在另一方面,您指出您在使用QSortFilterProxyModel时遇到了问题,在指出问题所在之前,您必须了解视图不知道也不感兴趣如果您知道模型是否是代理,只需等待模型和QModelIndex作为属于该模型的根索引。在您的例子中,必须使用
mapFromSource()
方法将QFileSystemModel的索引转换为QSortFilterProxyModel的索引。在最后,似乎有一个bug,因为当数据被过滤后变为空时,rootIndex在内部发生了变化,因此必须像我在回答中所做的那样重新建立它。在
相关问题 更多 >
编程相关推荐