2010-04-08 9 views
5

Chcę, aby filtr w QFileDialog pasował do wszystkich typów plików audio obsługiwanych przez Phonon na platformie, o której mowa.Filtr QFileDialog z mime-type

1 - Jednak nie jestem w stanie znaleźć sposobu w Qt, aby użyć typów MIME w filtrze. Jak mogę to zrobić?

2 - Lub w jaki sposób mogę ręcznie znaleźć odpowiednie rozszerzenia plików dla rodzajów MIME? Rozwiązanie powinno być oparte na Qt, lub przynajmniej być platformą crossową i wspieraną wszędzie tam, gdzie jest Qt.

Opcja jest moim preferowanym rozwiązaniem, jednak opcja dwa zrobi jak dobrze ..

Poniżej krótki kod opisujący mój 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); 
} 

Odpowiedz

0

Można filtrować na typach MIME przy pomocy QFileDialog::setProxyModel. Prawdopodobnie będziesz chciał podklasę QSortFilterProxyModel i zastąpić filterAcceptsRow, aby akceptował tylko wtedy, gdy plik jest odpowiedniego typu MIME. Mam nadzieję, że w połączeniu z prostym sposobem identyfikacji plików typu MIME będzie to dobre rozwiązanie.

+0

Fajnie, to jest dobre rozwiązanie. Na ile widzę, są jednak dwie wady. Podrzędny, ponieważ okno dialogowe filtru w oknie dialogowym nie zostanie wypełnione dozwolonymi typami plików. Możesz jednak po prostu umieścić tam opisowy tekst. Podobnie jak w moim przypadku "Pliki audio". Poważniejszą wadą jest to, że nie można już korzystać z dialogów plików rodzimych. To jest dla mnie przystawka na pokaz, a moim ostatecznym (?) Rozwiązaniem jest wysłanie pliku mime.types z moją aplikacją, ale go nienawidzę! Jeśli nie zależy Ci na rodzimym oknie dialogowym, jest to moim zdaniem lepsze rozwiązanie. Dlatego zaznaczam to jako poprawną odpowiedź. – Mathias

+0

Tak, rodzime okna dialogowe plików mają swoje zalety i problemy. Są bardziej niezawodne niż okna dialogowe Qt (szczególnie w przypadku udziałów sieciowych i ulubionych), ale nie można dostosowywać tekstu przycisku i innych rzeczy, jak to możliwe, za pomocą okien dialogowych Qt. Filtr rozwijany WRT, masz rację. Ciekaw jestem, czy pliki są filtrowane na podstawie rozszerzenia po wprowadzeniu modelu proxy, ale nie zostały przetestowane, aby wiedzieć na pewno. –

0

połączenia availableMimeTypes() na backend Phonon i następnie pętli wynikowa lista typu MIME i dla każdego wylicza rozszerzenia zwrócone przez QMimeType::extensions().

+0

QMimeType nie jest częścią Qt, ale część biblioteki QT Extended. Co jest dość dużą biblioteką do tak małego zadania. Ale zajrzałem do kodu źródłowego qmimetype.cpp, aby zobaczyć, co zrobili. Niestety wydaje się, że biblioteka to tylko GNU/Linux. Sposób, w jaki znajdują rozszerzenia, polega na wyodrębnieniu ich z /etc/mime.types, który nie jest platformą. – Mathias

+0

Zignoruj ​​poprzedni komentarz, jest błędny! Okazuje się, że Qt Extended faktycznie zawiera własny plik mime.types, stąd metoda wymieniona w powyższej odpowiedzi to platforma. Ale nie dobrze. Mogę wyłączyć, po prostu utwórz podobny plik, ale utrzymanie go to praca. I ważniejsze jest, że plik jest niekompletny i brakuje typów mime. Ta informacja IS, którą system operacyjny już zna (w rzeczywistości tylko system operacyjny wie, i tylko w czasie wykonywania), więc wszystko oprócz proszenia systemu operacyjnego nie jest dobrym rozwiązaniem. Dlatego wciąż szukam rozwiązania tego problemu. – Mathias