2010-04-08 6 views
5

Ich möchte, dass der Filter in einem QFileDialog mit allen Audiodateitypen übereinstimmt, die von Phonon auf der fraglichen Plattform unterstützt werden.QFileDialog-Filter von Mime-Typen

1 - Allerdings kann ich in Qt keinen Weg finden, MIME-Typen in einem Filter zu verwenden. Wie kann ich das machen?

2 - Oder wie finde ich die entsprechenden Dateierweiterungen für die MIME-Typen manuell? Die Lösung sollte Qt-basiert sein oder zumindest plattformübergreifend sein und überall unterstützt werden.

Option eines ist meine bevorzugte Lösung, aber Option zwei als auch tun ..

Es folgt eine kurze Kode mein Problem:

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

Antwort

0

Sie können mit QFileDialog::setProxyModel nach Mime-Typen filtern. Wahrscheinlich möchten Sie die Unterklasse QSortFilterProxyModel ableiten und filterAcceptsRow so überschreiben, dass sie nur akzeptiert wird, wenn die Datei den passenden MIME-Typ aufweist. Hoffentlich wird dies, wenn es mit einem einfachen Weg zur Identifizierung der Mime-Typen einer Datei verbunden ist, als eine gute Lösung dienen.

+0

Schön, das ist eine gute Lösung. Es gibt jedoch zwei Nachteile, soweit ich sehen kann. Eine kleine, da die Filter Dropdown-Box im Dialogfeld nicht mit zulässigen Dateitypen gefüllt wird. Sie können jedoch wahrscheinlich nur einen beschreibenden Text dort einfügen. Wie in meinem Fall "Audiodateien". Ein gravierenderer Nachteil ist, dass Sie native Dateidialoge nicht mehr verwenden können. Dies ist ein Show-Stopper für mich und meine letzte (?) Lösung ist eine Mime.types-Datei mit meiner Anwendung zu versenden, aber ich hasse es! Wenn dir der native Dialog egal ist, ist das meiner Meinung nach eine bessere Lösung. Daher markiere ich es als eine richtige Antwort. – Mathias

+0

Ja, native Dateidialoge haben ihre Vorteile und ihre Probleme. Sie sind zuverlässiger als die Qt-Dialoge (insbesondere mit Netzwerkfreigaben und Favoriten), aber Sie können nicht wie in den Qt-Dialogen Schaltflächen-Text und andere Dinge anpassen. WRT Dropdown-Filter, Sie haben Recht. Ich bin neugierig, ob die Dateien basierend auf der Erweiterung gefiltert werden, nachdem ein Proxy-Modell installiert wurde, aber nicht getestet, um sicher zu wissen. –

0

Anruf availableMimeTypes() auf dem Phonon-Backend und dann Schleife durch die resultierende MIME-Typ-Liste und für jede die Erweiterungen auf, die von QMimeType::extensions() zurückgegeben werden.

+0

QMimeType ist nicht Teil von Qt, sondern Teil der Bibliothek QT Extended. Das ist eine ziemlich große Bibliothek für so eine kleine Aufgabe. Aber ich habe in den Quellcode von qmimetype.cpp geschaut, um zu sehen, was sie gemacht haben. Leider scheint die Bibliothek nur GNU/Linux zu sein. Die Art, wie sie die Erweiterungen finden, besteht nur darin, sie aus /etc/mime.types zu extrahieren, was nicht plattformübergreifend ist. – Mathias

+0

Vernachlässige den vorherigen Kommentar, es ist falsch! Es stellt sich heraus, dass Qt Extended in der Tat seine eigene mime.types-Datei versendet, daher ist die in der obigen Antwort genannte Methode plattformübergreifend. Aber nicht gut. Ich kann aus nur eine ähnliche Datei erstellen, aber die Wartung ist es Arbeit. Und noch wichtiger ist, dass die Datei unvollständig ist und falsche MIME-Typen enthält. Diese IS-Informationen, die das Betriebssystem bereits kennt (in der Tat nur das Betriebssystem weiß und nur zur Laufzeit), so ist alles andere als die Frage des Betriebssystems keine gute Lösung. Daher suche ich immer noch nach einer Lösung für dieses Problem. – Mathias