2010-04-08 19 views
5

Quiero que el filtro en un QFileDialog coincida con todos los tipos de archivos de audio admitidos por Phonon en la plataforma en cuestión.Filtro QFileDialog de mime-types

1 - Sin embargo, no puedo encontrar una forma en Qt para usar tipos de mime en un filtro. ¿Cómo puedo hacer eso?

2 - ¿O cómo puedo encontrar manualmente las extensiones de archivo correspondientes para los tipos mimet? La solución debe estar basada en Qt, o al menos ser multiplataforma y admitida en todo lugar donde Qt lo esté.

primera opción es mi solución preferida, sin embargo la segunda opción va a hacer, así ..

A continuación se presenta un breve código que describe mi 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); 
} 

Respuesta

0

Puede filtrar en tipos de mime con QFileDialog::setProxyModel. Probablemente desee subclasificar QSortFilterProxyModel y anular filterAcceptsRow para que acepte solo cuando el archivo sea del tipo mime apropiado. Esperemos que esto, cuando esté vinculado con una manera fácil de identificar los tipos de mímico de un archivo, sirva como una buena solución.

+0

Bien, esta es una buena solución. Sin embargo, hay dos inconvenientes por lo que puedo ver. Menor, ya que el cuadro desplegable del filtro en el cuadro de diálogo no se completará con los tipos de archivo permitidos. Sin embargo, probablemente solo puedas poner un texto descriptivo allí. Como en mi caso "Archivos de audio". Un inconveniente más grave es que ya no puede usar los diálogos de archivos nativos. Esto es un obstáculo para mí y mi solución final (?) Es enviar un archivo mime.types con mi aplicación, ¡pero lo odio! Si no te importa el diálogo nativo, esta es una mejor solución en mi opinión. De ahí que lo marque como una respuesta correcta. – Mathias

+0

Sí, los diálogos de archivos nativos tienen sus beneficios y sus problemas. Son más confiables que los diálogos de Qt (especialmente con recursos compartidos de red y favoritos), pero no se puede personalizar el texto del botón y otras cosas como se puede con los cuadros de diálogo de Qt. Filtro desplegable WRT, tienes razón. Tengo curiosidad si los archivos se filtran en función de la extensión después de que se implementa un modelo de proxy, pero no se han probado para saberlo con certeza. –

0

llamada availableMimeTypes() en el backend fonón y luego a través del bucle la lista resultante de tipo MIME y para cada uno enumerar las extensiones devueltas por QMimeType::extensions().

+0

QMimeType no es parte de Qt, sino parte de la biblioteca QT Extended. Que es una biblioteca bastante grande para una tarea tan pequeña. Pero busqué en el código fuente de qmimetype.cpp para ver lo que hicieron. Desafortunadamente, parece que la biblioteca es solo GNU/Linux. La forma en que encuentran las extensiones es extraerlas de /etc/mime.types, que no es una plataforma cruzada. – Mathias

+0

Ignore el comentario anterior, ¡es incorrecto! Resulta que Qt Extended en realidad envía su propio archivo mime.types, de ahí que el método mencionado en la respuesta anterior sea multiplataforma. Pero no es bueno. No puedo causar simplemente crear un archivo similar, pero mantenerlo funciona. Y, lo que es más importante, el archivo está destinado a estar incompleto y omita los tipos mime. Esta es información que el sistema operativo ya conoce (de hecho, solo el sistema operativo lo sabe, y solo en tiempo de ejecución), por lo que cualquier cosa que no sea preguntar al sistema operativo no es una buena solución. Por lo tanto, todavía estoy buscando una solución a este problema. – Mathias

Cuestiones relacionadas