我有一个QFileDialog,我想过滤掉所有不在〜/ Documents中的路径。
当前有
from PyQt5 import QtCore
import os
...
dialog = QtWidgets.QFileDialog(...)
dialog.setDirectory(os.path.expanduser("~/Documents"))
dialog.setProxyModel(MyFilter())
selectedPath = dialog.exec_()
...
class MyFilter(QtCore.QSortFilterProxyModel):
def filterAcceptsRow(self, p_int, QModelIndex):
sourceModel = self.sourceModel()
index = sourceModel.index(p_int, 0,QModelIndex)
path = sourceModel.filePath(index)
return self._inside_documents_or_is_ancestor(path)
def _inside_documents_or_is_ancestor(self, path):
docpath = os.path.expanduser("~/Documents")
if path.startswith(docpath) or docpath.startswith(path):
print True, path, docpath
return True
return False
似乎没有任何路径被过滤,因为我可以在QFileDialog中的文件系统中选择任何文件。
我不确定filterAcceptsRow()的细节,但似乎如果我拒绝一个目录,它的子目录将不会被考虑,这就是为什么我接受那些我想要的路径的祖先的路径。
我正在运行pyqt 5.1和python 2.7.5
答案 0 :(得分:0)
根据评论讨论,我认为你的情况完全是错误的。
您正在使用os.path.startswith
,其中包含所有子文件夹,当然也是如此。你的问题写了那些需要保留。当然,你的病情分别是不正确的。
你应该写这样的东西:
if os.path.dirname(path) == docpath:
return False
请注意,您还返回了True
,因为您的情况本来就意味着,没有任何东西可以像您希望的那样被过滤掉。
此外,我会在用户界面设计中将此视为可用性问题。除非他们开始键入整个路径,否则用户将无法浏览该文件夹。一个更好的用户体验方法(在我看来肯定)将实际允许他们浏览,并在以后警告他们是否希望从该特定文件夹中选择一个文件。