Qfiledialog фильтр из типов MIME
-
25-09-2019 - |
Вопрос
Я хочу фильтр в QFileDialog соответствовать всем типам аудио файлов, поддерживаемых фононом на рассматриваемой платформе.
1 - однако я не могу найти способ в Qt использовать типы MIME в фильтре. Как я могу это сделать?
2 - или как я могу найти соответствующие расширения файлов для Mimetypes вручную? Решение должно быть на основе QT или, по крайней мере, перекрестная платформа и поддерживается везде Qt.
Вариант - мой предпочтительный раствор, однако опция два, а также ..
Ниже приведен краткий код, описывающий мою проблему:
#include <QApplication>
#include <QFileDialog>
#include <QStringList>
#include <phonon/backendcapabilities.h>
QStringList mime_to_exts(QString mime)
{
// WHAT TO REALLY DO ??
// NEEDLESS TO SAY; THIS IS WRONG...
return QStringList(mime.split("/").back().split('-').back());
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
app.setApplicationName("phononext");
QStringList p_audio_exts;
QStringList p_mime_types = Phonon::BackendCapabilities::availableMimeTypes();
for(QStringList::iterator i = p_mime_types.begin(), ie = p_mime_types.end(); i != ie; i++)
{
if((*i).startsWith("audio"))
p_audio_exts << mime_to_exts(*i);
}
QString filter = QString("All Files(*)");
if(!p_audio_exts.isEmpty())
{
QString p_audio_filter = QString("Audio Files (*.%1)").arg(p_audio_exts.join(" *."));
filter = QString("%1;;%2").arg(p_audio_filter).arg(filter);
}
QFileDialog::getOpenFileName(NULL, "Open Audio File", QString(), filter);
}
Решение
Вы можете фильтровать на типов MIME с QFileDialog::setProxyModel
. Отказ Вы, вероятно, захотите подкласс QSortFilterProxyModel
и переопределить filterAcceptsRow
Так что он принимает только тогда, когда файл имеет соответствующий тип MIME. Надеюсь, когда при связании с легким способом идентифицировать файловые типы MIME, послужит хорошим решением.
Другие советы
Вызов availableMimeTypes()
на фононном бэкэнда, а затем петлю через полученный список типов MIME, и для каждого перечисления, возвращаемых расширениями QMimeType::extensions()
.