2016-01-18 2 views
2

Есть ли способ установить нечувствительный к регистру фильтр на QFileDialog.Qt: Как установить нечувствительный к регистру фильтр на QFileDialog?

Я попробовал пример из дока:

QStringList mimeTypeFilters; 
mimeTypeFilters << "image/jpeg" // will show "JPEG image (*.jpeg *.jpg *.jpe) 
      << "image/png" // will show "PNG image (*.png)" 
      << "application/octet-stream"; // will show "All files (*)" 

QFileDialog dialog(this); 
dialog.setMimeTypeFilters(mimeTypeFilters); 
dialog.exec(); 

Но диалог показывает только JPEGs с более низким расширением файла на Linux.

Использование setNameFilter также не работает.

EDIT

Проблема происходит только с диалога Натив файла (Ubuntu). Установка следующей опции решает проблему, но было бы неплохо, если бы она работала с диалоговым окном nativ.

dialog.setOption(QFileDialog::DontUseNativeDialog, true); 

https://bugreports.qt.io/browse/QTBUG-51712

ответ

0

Как вы пытаетесь использовать имя фильтра? Это должно быть что-то вроде этого:

QFileDialog f(0, tr("Select file(s)"),QDir::homePath(), 
       tr("Audio files(*.mp3 *.ogg *.wav *.flac);;All files(*)")); 
1

Поскольку setMimeTypeFilters утилита удобства вокруг setNameFilters, вы можете прочитать documentation последнего.

Говорят, что:

setMimeTypeFilters имеет то преимущество, что все возможные фильтры имен для каждого типа файла. Например, изображения в формате JPEG имеют три возможных расширения:

Эти расширения являются теми, которые вы указали для JPEG, в нижнем регистре.
Во всяком случае, тип мим is case insensitive по определению:

тип, подтип, и имена параметров не чувствительны к регистру. Например, TEXT, Text и TeXt являются эквивалентными медиа-типами верхнего уровня.

Это, как говорят, идиосинкратия Qt. Диалоговое окно файла хочет, чтобы пользователи отображали принятые типы как регулярное выражение, внутренний определенный тип mime определяет эти типы как строчные, поэтому он не удается получить их, если в верхнем регистре, хотя RFC указывает на противоположное.

Как вы это сделали, вы правы: типы mime не чувствительны к регистру в своих типах и подтипах, поэтому вы ожидаете соответствия JPG, а также JPG.

Удачи. :-)

Я бы, вероятно, открыл ошибку на Qt tracker, чтобы узнать, что они говорят об этом.

EDIT

Как уже упоминалось в комментариях, тот факт, что тип мим чувствителен к регистру, не влияет на самом деле расширение файла.
Из-за этого, даже если image/jpeg и image/JPEG - это то же самое, нет ничего, что заставило бы структуру рассмотреть .jpg и .JPG файлы все вместе.

Перейти к примеру из документации, мы имеем следующее:

mimeTypeFilters << "image/jpeg" // will show "JPEG image (*.jpeg *.jpg *.jpe) 
    << "image/png" // will show "PNG image (*.png)" 
    << "application/octet-stream"; // will show "All files (*)" 

Здесь говорится, что для типа пантомимы image/jpeg (независимо от того, что capitolized), принятые расширения устанавливаются jpeg и другие ,
Кроме того, я приведу еще раз, что следует из документации:

Например, изображения JPEG имеют три возможных расширений

Эти расширения, очевидно, jpegjpg и jpe, в нижнем регистре.

Итак, я все еще считаю это ошибкой в ​​способе, которым Qt подходит к проблеме, но можно утверждать, что проблема заключается в том, что вы фактически используете расширение, которое не рассматривается внутренним сопоставлением для типов mime ,

+0

* Тип, подтип и имена параметров не чувствительны к регистру * => это делает ** не ** подразумевает, что связанный список расширений файлов также не чувствителен к регистру. – peppe

+0

@peppe Интересная точка зрения. Таким образом, даже если 'image/jpeg' и' image/JPEG' совпадают, это не означает, что для расширений файлов. Это действительно имеет смысл, даже если бы я сказал обратное. Таким образом, это похоже на нечто большее, чем не определен RFC, поэтому может быть правильным или нет, как работает Qt. – skypjack

+0

Это было сказано, я думаю, что Qt должен фильтровать регистр нечувствительно (не потому, что спецификация говорит так, но из-за глупых Windows) – peppe

Смежные вопросы