2010-04-08 8 views
5

Desidero che il filtro in QFileDialog corrisponda a tutti i tipi di file audio supportati da Phonon sulla piattaforma in questione.QFileDialog filter from mime-types

1 - Tuttavia non riesco a trovare un modo in Qt per utilizzare i tipi MIME in un filtro. Come lo posso fare?

2 - O come posso trovare manualmente le estensioni dei file corrispondenti per i tipi di mimo? La soluzione dovrebbe essere basata su Qt, o almeno essere cross-platform e supportata ovunque sia Qt.

Opzione uno è la mia soluzione preferita, tuttavia l'opzione due faranno così ..

che segue è un breve codice che descrive il mio 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); 
} 

risposta

0

È possibile filtrare su tipi di mime con QFileDialog::setProxyModel. Probabilmente vorrai sottoclasse QSortFilterProxyModel e sostituirai filterAcceptsRow in modo che accetti solo quando il file è del tipo mime appropriato. Speriamo che questo, quando associato a un modo semplice per identificare i tipi di mime di un file, servirà come una buona soluzione.

+0

Bello, questa è una buona soluzione. Ci sono tuttavia due inconvenienti per quanto posso vedere. Uno minore, poiché la casella a discesa del filtro nella finestra di dialogo non verrà riempita con i tipi di file consentiti. Comunque probabilmente puoi semplicemente inserire del testo descrittivo lì. Come nel mio caso "File audio". Uno svantaggio più grave è che non è più possibile utilizzare le finestre di dialogo dei file nativi. Questo è uno stopper per me e la mia soluzione finale (?) È quella di spedire un file mime.types con la mia applicazione, ma io lo odio! Se non ti interessa il dialogo nativo, questa è una soluzione migliore secondo me. Quindi lo segnalo come risposta corretta. – Mathias

+0

Sì, le finestre di dialogo dei file nativi hanno i loro vantaggi e i loro problemi. Sono più affidabili delle finestre di dialogo Qt (specialmente con condivisioni di rete e preferiti), ma non è possibile personalizzare il testo dei pulsanti e altre cose come è possibile con le finestre di dialogo Qt. Filtro a discesa WRT, hai ragione. Sono curioso di sapere se i file vengono filtrati in base all'estensione dopo aver installato un modello proxy, ma non sono stati testati per essere sicuri. –

0

chiamata availableMimeTypes() sul backend Phonon e quindi scorrere l'elenco di tipi MIME risultante e per ognuna elencano le estensioni restituite da QMimeType::extensions().

+0

QMimeType non fa parte di Qt, ma parte della libreria QT Extended. Che è una biblioteca abbastanza grande per un compito così piccolo. Ma ho esaminato il codice sorgente di qmimetype.cpp per vedere cosa hanno fatto. Sfortunatamente sembra che la libreria sia solo GNU/Linux. Il modo in cui trovano le estensioni è solo per estrarle da /etc/mime.types, che non è multipiattaforma. – Mathias

+0

Ignora il commento precedente, è sbagliato! Si scopre che Qt Extended spedisce infatti il ​​proprio file mime.types, quindi il metodo menzionato nella risposta sopra è multipiattaforma. Ma non va bene. Posso causare perché basta creare un file simile, ma il mantenimento è lavoro. E più importante è che il file sia incompleto e manchi i tipi mime. Si tratta di informazioni che il sistema operativo già conosce (in realtà solo il sistema operativo conosce e solo in fase di esecuzione), quindi tutto tranne il fatto di chiedere al sistema operativo non è una buona soluzione. Pertanto sto ancora cercando una soluzione a questo problema. – Mathias