从QFileDialog打开或创建目录

问题描述 投票:0回答:1

我需要创建一个用于选择日志目录的对话框,如果输入的名称不存在,则该对话框允许选择目录或创建目录。我已经能够完成一个或另一个,但不能一次完成。

使用接受模式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中实现。

python pyqt pyqt5 qfiledialog
1个回答
0
投票

当然,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()
© www.soinside.com 2019 - 2024. All rights reserved.