我需要创建一个用于选择日志目录的对话框,如果输入的名称不存在,则该对话框允许选择目录或创建目录。我已经能够完成一个或另一个,但不能一次完成。
使用接受模式QFileDialog.AcceptOpen
,我可以打开目录。
使用接受模式QFileDialog.AcceptSave
,我可以创建目录,但是无法打开现有目录。
代码段:
def open_or_create_directory(self, log_dir):
"""
open or create a directory
Doesn't work!!!
"""
dialog = QtWidgets.QFileDialog(self, caption='Data Log File Dir')
dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptSave)
dialog.setDirectory(log_dir)
dialog.setFileMode(QtWidgets.QFileDialog.ExistingFiles)
dialog.setOption(QtWidgets.QFileDialog.ShowDirsOnly, True)
dialog.setLabelText(QtWidgets.QFileDialog.Accept, "Select")
if dialog.exec_() == QtWidgets.QFileDialog.Accepted:
logdir = dialog.selectedFiles()
我能够找到的最接近的路径是QFileDialog: Selecting directories and files,但我不知道如何在python中实现。
当然,OP指出的内容取决于操作系统的本机对话,因为在我的桌面管理器(plasma-KDE)中,它允许我同时执行两项任务,例如,单击一下即可在目录中导航,并且双击单击它可以编辑路径,然后单击鼠标右键打开一个菜单,其中一个选项可以创建目录。
如果问题是本机对话,则可以使用自定义Qt对话框来启用QFileDialog :: DontUseNativeDialog选项,在其中单击即可导航,右键单击菜单将打开其中一个动作。允许创建新文件夹的选项
from PyQt5 import QtWidgets
def open_or_create_directory(log_dir):
"""
open or create a directory
"""
dialog = QtWidgets.QFileDialog(None, caption='Data Log File Dir')
dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
dialog.setDirectory(log_dir)
dialog.setFileMode(QtWidgets.QFileDialog.ExistingFiles)
dialog.setOption(QtWidgets.QFileDialog.ShowDirsOnly, True)
dialog.setLabelText(QtWidgets.QFileDialog.Accept, "Select")
if dialog.exec_() == QtWidgets.QFileDialog.Accepted:
logdir = dialog.selectedFiles()
print(logdir)
if __name__ == '__main__':
app = QtWidgets.QApplication([])
open_or_create_directory("/path/of/directory")
如果您认为this link的解决方案是正确的,那么很容易将其转换为python:
dialog = QtWidgets.QFileDialog(self)
dialog.setFileMode(QtWidgets.QFileDialog.Directory)
dialog.setOption(QtWidgets.QFileDialog.DontUseNativeDialog, True)
l = dialog.findChild(QtWidgets.QListView, "listView")
if l is not None:
l.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
t = dialog.findChild(QtWidgets.QTreeView)
if t is not None:
t.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
nMode = dialog.exec_()
names = dialog.selectedFiles()