QFileDialog根据位置过滤掉路径

时间:2013-12-31 00:49:55

标签: python qt pyqt qfiledialog

我有一个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

1 个答案:

答案 0 :(得分:0)

根据评论讨论,我认为你的情况完全是错误的。

您正在使用os.path.startswith,其中包含所有子文件夹,当然也是如此。你的问题写了那些需要保留。当然,你的病情分别是不正确的。

你应该写这样的东西:

if os.path.dirname(path) == docpath:
    return False

请注意,您还返回了True,因为您的情况本来就意味着,没有任何东西可以像您希望的那样被过滤掉。

此外,我会在用户界面设计中将此视为可用性问题。除非他们开始键入整个路径,否则用户将无法浏览该文件夹。一个更好的用户体验方法(在我看来肯定)将实际允许他们浏览,并在以后警告他们是否希望从该特定文件夹中选择一个文件。