从QFileDialog打开或创建目录

2024-04-27 03:37:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个用于选择日志目录的对话框,该对话框允许选择目录,或者如果键入的名称不存在,则允许创建目录。我能够做到其中一个,但不能同时做到两个

使用接受模式QFileDialog.AcceptOpen,我可以打开目录

使用Accept模式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中实现这一点


Tags: orself目录logcreatedir模式open
1条回答
网友
1楼 · 发布于 2024-04-27 03:37:09

当然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()

相关问题 更多 >