Как использовать параметры QFileDialog и получить saveFileName?

Я пытаюсь использовать QFileDialog, чтобы предложить пользователю указать имя файла и местоположение для сохранения текстового файла. Я играл с QtGui.QFileDialog.getSaveFileName, но мне было интересно использовать некоторые параметры, такие как установка суффикса по умолчанию и включение подробного представления диалогового окна сохранения файла, которое, насколько я мог сказать, не можно сделать, используя только getSaveFileName. Всякий раз, когда я их устанавливал, диалоговое окно getSaveFileName просто игнорировало их.

Итак, я закончил с чем-то вроде этого:

dlg=QtGui.QFileDialog( self )
dlg.setWindowTitle( 'Print Things' )
dlg.setViewMode( QtGui.QFileDialog.Detail )
dlg.setNameFilters( [self.tr('Text Files (*.txt)'), self.tr('All Files (*)')] )
dlg.setDefaultSuffix( '.txt' )
if dlg.exec_() :
    print dlg

Однако теперь я не уверен, как получить имя файла, переданного пользователем? Если я напечатаю dlg.getSaveFileName, появится еще одно диалоговое окно сохранения файла. Кто-нибудь знает, как это сделать, при этом передавая все параметры в QFileDialog, которые я хочу уважать?


person user3161430    schedule 04.01.2014    source источник


Ответы (2)


Нет необходимости создавать объект QFileDialog, потому что он предоставляет четыре статических метода, которые можно использовать в соответствии с вашими потребностями.

1) QFileDialog.getExistingDirectory(...)
2) QFileDialog.getOpenFileName(...)
3) QFileDialog.getOpenFileNames(...)
4) QFileDialog.getSaveFileName(...)

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

fileName = QtGui.QFileDialog.getSaveFileName(self, 'Dialog Title', '/path/to/default/directory', selectedFilter='*.txt')
if fileName:
    print fileName

Вы можете оставить /path/to/default/directory пустой строкой, если не знаете, в каком каталоге пользователь может сохранить файл.

Теперь, когда пользователь нажимает кнопку «Сохранить» в диалоговом окне после ввода имени файла (без расширения файла), этот метод возвращает путь к файлу, за которым следует расширение .txt.

Дополнительную информацию о QFileDialog.getSaveFileName() можно найти здесь

person qurban    schedule 05.01.2014
comment
Вы действительно тестировали что-либо из этого с помощью pyqt4? В вашем примере кода возникает ошибка ключевого слова. Но в любом случае, даже с правильными аргументами, он не даст того вывода, о котором вы заявляете (то же самое касается pyqt5 и pyside). - person ekhumoro; 06.01.2014
comment
Да, конечно! Я проверил это, а затем вставил сюда. Работает как шарм! Увидев ваш комментарий, я снова скопировал приведенную выше строку и вставил ее в eclipse, никаких проблем! - person qurban; 06.01.2014
comment
Ваш код кажется специфичным для Windows: он не работает в Linux и, возможно, не работает в OSX (я не могу проверить). Под не работает я подразумеваю, что расширение не добавлено (что, возможно, является правильным поведением). Однако ошибка ключевого слова, похоже, специфична для python3 - я не получаю ошибку с python2. Итак, в целом, если вы ищете общее кроссплатформенное решение, статические методы не так уж хороши. - person ekhumoro; 06.01.2014
comment
Да, я использую Windows, но я попробую на Linux. Спасибо за полезную информацию. - person qurban; 07.01.2014
comment
Осмелюсь не согласиться с тем, что нет необходимости создавать объект QFileDialog. Например, все еще остается открытым вопрос о том, что использование диалогового окна не добавляет автоматически расширение файла на основе выбранного фильтра типа mime, поэтому разработчик имеет позаботиться об этом самостоятельно, иначе все может запутаться. PS: я также рекомендую не использовать /path/to/file, а вместо этого использовать инструменты QDir (такие как QDir::homePath() и QDir::cdUp() (но не QDir::cd(...))), которые предоставляются в хотя бы частичная обработка проблем, возникающих при использовании URL-адресов путей на разных платформах. - person rbaleksandar; 14.03.2016
comment
@qurban Я попробовал ваш код с платформой Windows и Python 2.7, но расширение не удалось добавить. - person limonik; 03.01.2018
comment
docstring в возвращаемом типе сообщает имя файла, вместо этого они должны сообщать, является ли его тип string или какой-либо другой. - person Ciasto piekarz; 17.06.2020

dlg.selectedFiles() возвращает список строк Unicode, содержащих выбранные имена файлов.

person three_pineapples    schedule 04.01.2014