PyQT5 стартовая директория QFileDialog
Кратко: в QFileDialog сделать начальной директорией выбора файла стандартную папку Windows (рабочий стол, изображения и т.п.).
Подробно: у функции getOpenFileName есть параметр "directory", указывающий начальную директорию, при этом, как я понял, он жёстко прописан.
Как сделать так, чтобы на любом компьютере окно выбора файла изначально открывалось, например, на рабочем столе?
Заранее спасибо!
Ответы (2 шт):
QString QFileDialog::getOpenFileName(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(), # !!!
const QString &filter = QString(),
QString *selectedFilter = nullptr,
QFileDialog::Options options = Options()
)
Это удобная статическая функция, которая возвращает существующий файл, выбранный пользователем.
Если пользователь нажимает кнопку Отмена, он возвращает пустую строку.
Рабочий каталог файла диалога будет установлен в каталог.
Если dir содержит имя файла, файл будет выбран.
Отображаются только файлы, которые соответствуют данному фильтру.
Выбранный фильтр установлен на selectedFilter.
Параметры dir, selectedFilter и filter могут быть пустыми строками.
Если вам нужно несколько фильтров, разделите их с помощью ';;', ...
import os
...
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
'Open File',
os.path.join(os.path.join(os.path.expanduser('~')), 'Desktop') # !!!
)
if filename:
print(f'Выбрали файл: {filename}')
...
В Qt есть специальный класс QStandartPaths. Он служит для получения стандартных директорий, не только для десктопа, но и, по-возможности, для любых платформ.
В частности, для получения доступа к рабочему столу компа, можно воспользоваться статическим методом writableLocation, который вернет путь, если указанная директория доступна для записи, а иначе вернется пустая строка:
dir = QStandardPaths.writableLocation(QStandardPaths.DesktopLocation)
Если вам не нужна директория для записи, то вы можете воспользоваться статическим методом locate:
dir = QStandardPaths.locate(QStandardPaths.DesktopLocation,'', QStandardPaths::LocateDirectory)
А дальше передать полученное значение в QFileDialog.getOpenFileName:
QFileDialog.getOpenFileName(
<Родительский виджет, или None>,
<Строка-заголовок диалога выбора файла>,
dir)