PyQt - QFileDialog - напрямую перейти к папке?

Есть ли способ напрямую перейти к папке с помощью QFileDialog?

Это означает, что вместо двойного щелчка по каждой папке при переходе к папке назначения просто введите где-нибудь путь или используйте горячую клавишу, например (Shift + Command + G) в Finder в Mac OS X.

Спасибо!

EDIT: (мой код)

    filter = "Wav File (*.wav)"
    self._audio_file = QtGui.QFileDialog.getOpenFileName(self, "Audio File",
                                                        "/myfolder/folder", filter)
    self._audio_file = str(self._audio_file)

person YaronGh    schedule 03.08.2016    source источник


Ответы (5)


Если вы используете статические функции QFileDialog, вы получите собственное файловое диалоговое окно и, таким образом, будете ограничены функциями, предоставляемыми платформой. Вы можете ознакомиться с документацией по вашей платформе, чтобы узнать, доступны ли нужные вам функции.

Если он недоступен, вам придется довольствоваться встроенным файловым диалоговым окном Qt и добавлять свои собственные функции. Для вашего конкретного варианта использования это должно быть легко, потому что во встроенном диалоговом окне уже есть то, что вы хотите. Он имеет боковую панель, которая показывает список "мест", которые пользователь может перейти напрямую. Вы можете установить свои собственные места следующим образом:

dialog = QtGui.QFileDialog(self, 'Audio Files', directory, filter)
dialog.setFileMode(QtGui.QFileDialog.DirectoryOnly)
dialog.setSidebarUrls([QtCore.QUrl.fromLocalFile(place)])
if dialog.exec_() == QtGui.QDialog.Accepted:
    self._audio_file = dialog.selectedFiles()[0]
person ekhumoro    schedule 03.08.2016
comment
Отлично, вещь Sidebar определенно помогает. Спасибо! - person YaronGh; 03.08.2016

Вот удобная функция для быстрого открытия/сохранения QFileDialog.

from PyQt5.QtWidgets import QFileDialog, QDialog
from definitions import ROOT_DIR
from PyQt5 import QtCore


def FileDialog(directory='', forOpen=True, fmt='', isFolder=False):
    options = QFileDialog.Options()
    options |= QFileDialog.DontUseNativeDialog
    options |= QFileDialog.DontUseCustomDirectoryIcons
    dialog = QFileDialog()
    dialog.setOptions(options)

    dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden)

    # ARE WE TALKING ABOUT FILES OR FOLDERS
    if isFolder:
        dialog.setFileMode(QFileDialog.DirectoryOnly)
    else:
        dialog.setFileMode(QFileDialog.AnyFile)
    # OPENING OR SAVING
    dialog.setAcceptMode(QFileDialog.AcceptOpen) if forOpen else dialog.setAcceptMode(QFileDialog.AcceptSave)

    # SET FORMAT, IF SPECIFIED
    if fmt != '' and isFolder is False:
        dialog.setDefaultSuffix(fmt)
        dialog.setNameFilters([f'{fmt} (*.{fmt})'])

    # SET THE STARTING DIRECTORY
    if directory != '':
        dialog.setDirectory(str(directory))
    else:
        dialog.setDirectory(str(ROOT_DIR))


    if dialog.exec_() == QDialog.Accepted:
        path = dialog.selectedFiles()[0]  # returns a list
        return path
    else:
        return ''
person kblst    schedule 10.01.2019
comment
ROOT_DIR = os.path.abspath(__file__)? Что это за модуль definitions? - person gabriel garcia; 08.02.2021

Вместо этого используйте метод getExistingDirectory:

from PyQt5.QtWidgets import QFileDialog

dialog = QFileDialog()
foo_dir = dialog.getExistingDirectory(self, 'Select an awesome directory')
print(foo_dir)
person user3160702    schedule 24.08.2019
comment
Правильно (только сейчас заметил). Единственная разница будет в версии PyQt (4 против 5) - person user3160702; 28.08.2019

В PyQt 4 вы можете просто добавить QFileDialog для создания окна с текстовым полем пути, встроенным в диалоговое окно. Вы можете вставить свой путь сюда.

QtGui.QFileDialog.getOpenFileName(self, 'Select file')  # For file.

Для выбора каталога:

QtGui.QFileDialog.getExistingDirectory(self, 'Select directory')

Каждый будет иметь текстовое поле пути:

введите здесь описание изображения

person ospahiu    schedule 03.08.2016
comment
У меня почему-то это не работает.. использую: QtGui.QFileDialog.getOpenFileName(self, "Load File", filter). Я не понимаю это текстовое поле пути. filter — это такая строка, которую я создал для выбора определенного типа файлов. - person YaronGh; 03.08.2016
comment
И, как я упоминал ниже, если я настрою свой QFileDialog на открытие каталогов, а затем введу путь к каталогу в появившемся текстовом поле пути по умолчанию, он просто выберет эту папку и вернется, он не переходит к ней и остается там. - person YaronGh; 03.08.2016
comment
Возможно, опубликуйте скриншот вашего диалога и полный код? - person ospahiu; 03.08.2016

Ниже вы найдете простой тест, который открывает диалог непосредственно по определенному пути, в данном случае это будет текущий рабочий каталог. Если вы хотите напрямую открыть другой путь, вы можете просто использовать функции каталога python, включенные в модуль os.path:

 import sys
 import os
 from PyQt4 import QtGui


 def test():
      filename = QtGui.QFileDialog.getOpenFileName(
           None, 'Test Dialog', os.getcwd(), 'All Files(*.*)')

 def main():
     app = QtGui.QApplication(sys.argv)

     test()

     sys.exit(app.exec_())

 if __name__ == "__main__":
     main()
person BPL    schedule 03.08.2016
comment
Спасибо, но это не совсем то, что я искал. Я имел в виду, что хочу, чтобы пользователь мог перейти к определенному каталогу (без двойного щелчка до него) после того, как диалоговое окно с файлом уже было открыто. - person YaronGh; 03.08.2016
comment
Не уверен, правильно ли я понял, getOpenFileName уже включает панель навигации, где вы можете ввести свой путь напрямую, не используя мышь вообще, это то, что вы хотите? - person BPL; 03.08.2016
comment
Да, но если я настрою свой QFileDialog на открытие каталогов, а затем введу путь к каталогу, он просто выберет его и вернется, а не перейдет к нему и останется там. - person YaronGh; 03.08.2016
comment
Ммм, я пробовал как getOpenFileName, так и getExistingDirectory в Windows, и как только я набираю свой путь на панели навигации и нажимаю ввод, диалоговое окно не закрывается и остается там. Возможно, в MacOSX это не поведение по умолчанию. - person BPL; 03.08.2016
comment
Странно.. может быть, это действительно не так. - person YaronGh; 03.08.2016