-1

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

4

1 回答 1

0

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

您使用os.path.startswith的自然也将包括所有子文件夹。您的问题写道,这些需要保留。当然,您的条件分别是不正确的。

你应该写这样的东西:

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

请注意,您还返回True了您的条件,这本质上意味着,没有什么会真正像您想要的那样被过滤掉。

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

于 2013-12-31T02:11:40.017 回答