Открыть или создать каталог из QFileDialog - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужно создать диалоговое окно для выбора каталога журналов, которое позволяет либо выбрать каталог, либо создать каталог, если имя, введенное в него, не существует. Я смог выполнить sh один или другой, но не оба одновременно.

В режиме Accept 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: Выбор каталогов и файлов но я не знаю, как реализовать это в python.

1 Ответ

1 голос
/ 20 февраля 2020

Конечно, на что указывает 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")

Если вы посчитайте решение этой ссылки правильным, тогда его легко перевести в 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()
...