2010-04-08 5 views
5

Je souhaite que le filtre dans un QFileDialog corresponde à tous les types de fichiers audio pris en charge par Phonon sur la plate-forme en question.Filtre QFileDialog de type mime

1 - Cependant, je ne suis pas capable de trouver un moyen dans Qt d'utiliser des types MIME dans un filtre. Comment puis je faire ça?

2 - Ou comment puis-je trouver manuellement les extensions de fichier correspondantes pour les mimetypes? La solution doit être basée sur Qt, ou au moins être multi plate-forme et supportée partout où Qt est.

La première option est ma solution préférée, mais l'option deux vont faire aussi bien ..

suivant est un code court qui décrit mon problème:

#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); 
} 

Répondre

0

Vous pouvez filtrer sur les types MIME avec QFileDialog::setProxyModel. Vous voudrez probablement sous-classer QSortFilterProxyModel et remplacer filterAcceptsRow pour qu'il accepte uniquement lorsque le fichier est du type mime approprié. Espérons que cela, une fois lié avec un moyen facile d'identifier les types mime d'un fichier, servira de bonne solution.

+0

Nice, c'est une bonne solution. Il y a cependant deux inconvénients pour autant que je puisse voir. Un mineur, étant que la boîte déroulante de filtre dans la boîte de dialogue ne sera pas remplie avec les types de fichiers autorisés. Cependant, vous pouvez probablement y mettre un texte descriptif. Comme dans mon cas "Fichiers audio". Un inconvénient plus grave est que vous ne pouvez plus utiliser les boîtes de dialogue de fichiers natifs. Ceci est un bouchon de spectacle pour moi et ma solution finale (?) Est d'expédier un fichier mime.types avec mon application, mais je déteste! Si vous ne vous souciez pas du dialogue natif c'est une meilleure solution à mon avis. Par conséquent, je le marque comme une réponse correcte. – Mathias

+0

Oui, les boîtes de dialogue de fichiers natifs ont leurs avantages et leurs problèmes. Ils sont plus fiables que les boîtes de dialogue Qt (en particulier avec les partages réseau et les favoris), mais vous ne pouvez pas personnaliser le texte des boutons et d'autres choses comme vous pouvez le faire avec les boîtes de dialogue Qt. Filtre déroulant WRT, vous avez raison. Je suis curieux de savoir si les fichiers sont filtrés en fonction de l'extension après la mise en place d'un modèle de proxy, mais qu'ils n'ont pas été testés pour être sûrs. –

0

Appel availableMimeTypes() sur le back-end Phonon et boucle à travers la liste de types MIME résultante et pour chacun énumérer les extensions renvoyées par QMimeType::extensions().

+0

QMimeType ne fait pas partie de Qt, mais fait partie de la bibliothèque QT Extended. Ce qui est une bibliothèque assez grande pour une si petite tâche. Mais j'ai regardé dans le code source de qmimetype.cpp pour voir ce qu'ils ont fait. Malheureusement, il semble que la bibliothèque soit uniquement GNU/Linux. La façon dont ils trouvent les extensions est simplement de les extraire de /etc/mime.types, ce qui n'est pas multi-plateforme. – Mathias

+0

Ne tenez pas compte du commentaire précédent, c'est faux! Il s'avère que Qt Extended expédie en fait son propre fichier mime.types, d'où la méthode mentionnée dans la réponse ci-dessus est multi-plateforme. Mais pas bon. Je ne peux pas créer juste un fichier similaire, mais le maintenir est un travail. Et plus important encore le fichier est forcément incomplet, et manque de mime-types. Ce sont des informations que le système d'exploitation sait déjà (en fait, seul le système d'exploitation connaît, et seulement au moment de l'exécution), donc tout sauf demander le système d'exploitation n'est pas une bonne solution. Par conséquent, je suis toujours à la recherche d'une solution à ce problème. – Mathias