PyQT5. QFileDialog не фильтрует файлы по расширению. Что делаю не так?

Есть шаблон для загрузки файлов. Мне нужно загружать картинки, причем с расширением только .png. Соответственно, нужно и в диалоговом окне отображать только такие файлы, а **остальные - скрывать**.

Подскажите, что я написал не правильно?

Прописал код:

imagePathTuple = QFileDialog.getOpenFileName(
    None, 
    'Выбрать изображение', 
    '*', 
    "Image files (*.png)"
)

В конце вроде как фильтр по расширению, но в окне всё равно все файлы что есть в папке.

показаны все файлы, а нужно только png


Ответы (1 шт):

Автор решения: S. Nick

Класс QFileDialog позволяет пользователю перемещаться по файловой системе, чтобы выбрать один или несколько файлов или каталог.

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()
)

getOpenFileName это удобная статическая функция, которая возвращает существующий файл, выбранный пользователем. Если пользователь нажимает Отмена, возвращается пустая строка.

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

Рабочий каталог диалогового окна файла будет установлен на dir. Если dir включает имя файла, он будет выбран. Отображаются только файлы, соответствующие заданному фильтру. Выбранный фильтр установлен на selectedFilter. Параметры dir, selectedFilter и filter могут быть пустыми строками.

В Windows и macOS эта статическая функция будет использовать собственное диалоговое окно файла, а не QFileDialog.

В вашем случае:

imagePathTuple = QFileDialog.getOpenFileName(
  None,                                       # QWidget *parent = nullptr,
  'Выбрать изображение',                      # const QString &caption = QString(),
  '*',                                        # const QString &dir = QString(),    <<<---- !!!            
  "Image files (*.png)"                       # const QString &filter = QString(), 
)

Рабочий каталог dir -> '*' интерпретируется как выбрать все файлы и перебивает filter.

Оставьте это поле пустым или укажите рабочий каталог.

imagePathTuple = QFileDialog.getOpenFileName(
  None,                    
  'Выбрать изображение',   
  '',                                         #  <<<---- !!!   
  # или так:
  # "/home",                                  #  <<<---- !!!   
  "Image files (*.png)"   
)
→ Ссылка