Pergunta

Quero que o filtro em um qfiledialog corresponda a todos os tipos de arquivos de áudio suportados pelo Phonon na plataforma em questão.

1 - No entanto, não consigo encontrar uma maneira no QT para usar os tipos MIME em um filtro. Como eu posso fazer isso?

2 - ou como posso encontrar as extensões de arquivo correspondentes para os mimetipos manualmente? A solução deve ser baseada no QT, ou pelo menos ser uma plataforma cruzada e suportada em todos os lugares QT.

A opção um é a minha solução preferida, no entanto, a opção dois também fará ..

A seguir, é apresentado um código curto que descreve meu problema:

#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);
}
Foi útil?

Solução

Você pode filtrar em tipos de mímica com QFileDialog::setProxyModel. Você provavelmente vai querer subclasse QSortFilterProxyModel e substituir filterAcceptsRowpara que aceite apenas quando o arquivo é do tipo MIME apropriado. Espero que isso, quando vinculado a uma maneira fácil de identificar os tipos de mímica de um arquivo, servirá como uma boa solução.

Outras dicas

Ligar availableMimeTypes() no back-end do phonon e depois percorre a lista de mímica resultante e para cada um enumerar as extensões devolvidas por QMimeType::extensions().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top