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

时间:2016-07-27 22:29:45

标签: python qt pyqt qfiledialog

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

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 个答案:

答案 0 :(得分:2)

为了防止选择文件,您可以安装代理模型来操作文件视图中项目的标志:

class ProxyModel(QtGui.QIdentityProxyModel):
    def flags(self, index):
        flags = super(ProxyModel, self).flags(index)
        if not self.sourceModel().isDir(index):
            flags &= ~QtCore.Qt.ItemIsSelectable
        return flags


# keep a reference somewhere to prevent core-dumps on exit
self._proxy = ProxyModel(self)

file_dialog.setProxyModel(self._proxy)