-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 に答える