QFileDialog 查看文件夹和文件但只选择文件夹?

Posted

技术标签:

【中文标题】QFileDialog 查看文件夹和文件但只选择文件夹?【英文标题】:QFileDialog view folders and files but select folders only? 【发布时间】:2016-07-27 22:29:44 【问题描述】:

我正在使用以下代码创建自己的自定义文件对话框:

file_dialog = QtGui.QFileDialog()
file_dialog.setFileMode(QtGui.QFileDialog.Directory)
file_dialog.setViewMode(QtGui.QFileDialog.Detail)
file_dialog.setOption(QtGui.QFileDialog.DontUseNativeDialog, True)

我感兴趣的行为是让用户能够查看文件和文件夹,但只能选择文件夹。 (使文件无法选择)。那可能吗?

注意: 使用 DirectoryOnly 选项对我不利,因为它不允许您查看文件,只能查看文件夹。

编辑(我忘记添加的额外代码负责能够选择多个文件夹而不仅仅是一个):

file_view = file_dialog.findChild(QtGui.QListView, 'listView')
if file_view:
    file_view.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
f_tree_view = file_dialog.findChild(QtGui.QTreeView)
if f_tree_view:
    f_tree_view.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)

【问题讨论】:

您发布的代码完全符合您的要求(即用户可以查看文件和目录,但只能选择目录)。所以也许你需要更清楚地解释你想要实现的目标。 不是真的.. 上面的代码也允许您选择文件。 对我来说,“选择”按钮只有在我选择目录时才会启用。可以选择文件,但不能选择它们(因为按钮被禁用)。 这有点尴尬,但我刚刚发现还有另一段代码负责它。这是一个允许我选择多个文件夹而不仅仅是一个文件夹的代码 - 但它这样做的同时也给了我我提到的问题。我用该代码编辑了我的原始帖子。 查看我的最后评论;) 【参考方案1】:

为了防止文件被选中,您可以安装一个代理模型来处理文件视图中项目的标志:

dialog = QFileDialog()
dialog.setFileMode(QFileDialog.Directory)
dialog.setOption(QFileDialog.DontUseNativeDialog, True)

class ProxyModel(QIdentityProxyModel):
    def flags(self, index):
        flags = super(ProxyModel, self).flags(index)
        if not self.sourceModel().isDir(index):
            flags &= ~Qt.ItemIsSelectable
            # or disable all files
            # flags &= ~Qt.ItemIsEnabled
        return flags

proxy = ProxyModel(dialog)
dialog.setProxyModel(proxy)

dialog.exec()

【讨论】:

好的,非常感谢!我不确定我是否应该为此打开一个新问题(让我知道)-但是我可以对上面的代码进行快速修改以便能够同时选择文件夹和文件吗? @YaronGh。 file_dialog.setProxyModel(None). 如果我这样做,它会返回所选文件 + 该文件夹中的所有其他文件 @YaronGh。你将不得不更清楚地解释你想要做什么。 我正在尝试同时选择文件和文件夹,并让文件对话框返回这些文件和文件夹的路径。

以上是关于QFileDialog 查看文件夹和文件但只选择文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

防止 QFileDialog 中的文件操作,例如复制、查看、删除等

修改 QFileDialog::getOpenFileName 有一个额外的下拉

QFileDialog:强制文件名

接受单个文件或单个目录的 QFileDialog

PyQt4文件对话框QFileDialog

如何解决 QFileDialog 的过滤参数问题?