QFileDialog 查看文件夹和文件但仅 select 文件夹?
QFileDialog view folders and files but select folders only?
我正在使用以下代码创建自己的自定义文件对话框:
file_dialog = QtGui.QFileDialog()
file_dialog.setFileMode(QtGui.QFileDialog.Directory)
file_dialog.setViewMode(QtGui.QFileDialog.Detail)
file_dialog.setOption(QtGui.QFileDialog.DontUseNativeDialog, True)
我感兴趣的行为是让用户能够查看文件和文件夹,但只能查看 select 文件夹。 (使文件无法select可用)。那可能吗?
注:
使用 DirectoryOnly
选项对我不利,因为它不允许您查看文件,只能查看文件夹。
编辑(我忘记添加的额外代码负责能够select多个文件夹而不是一个):
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)
为了防止文件被选中,您可以安装一个代理模型来操纵文件视图中项目的标志:
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()
我正在使用以下代码创建自己的自定义文件对话框:
file_dialog = QtGui.QFileDialog()
file_dialog.setFileMode(QtGui.QFileDialog.Directory)
file_dialog.setViewMode(QtGui.QFileDialog.Detail)
file_dialog.setOption(QtGui.QFileDialog.DontUseNativeDialog, True)
我感兴趣的行为是让用户能够查看文件和文件夹,但只能查看 select 文件夹。 (使文件无法select可用)。那可能吗?
注:
使用 DirectoryOnly
选项对我不利,因为它不允许您查看文件,只能查看文件夹。
编辑(我忘记添加的额外代码负责能够select多个文件夹而不是一个):
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)
为了防止文件被选中,您可以安装一个代理模型来操纵文件视图中项目的标志:
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()