2017-09-24 9 views
1

J'utilise Qt 5.9 pour ouvrir une boîte de dialogue de fichier demandant à l'utilisateur de sélectionner un fichier image:QFileDialog combiner des filtres de type MIME à « Tous les formats »

QStringList mimeTypeFilters; 
const QByteArrayList supportedMimeTypes = QImageReader::supportedMimeTypes(); 
foreach(const QByteArray& mimeTypeName, supportedMimeTypes) { 
    mimeTypeFilters.append(mimeTypeName); 
} 
mimeTypeFilters.sort(); 

QFileDialog* fileDialog = new QFileDialog(this, "Select image"); 
fileDialog->setMimeTypeFilters(mimeTypeFilters); 
fileDialog->setFileMode(QFileDialog::ExistingFile); 
fileDialog->exec(); 

Tous les formats d'image pris en charge sont ajoutés sous forme de filtres de type MIME à le dialogue, qui fonctionne très bien. Cependant, je veux ajouter un filtre supplémentaire (tel que "Tous les formats" ou "Tous supportés") qui permet à l'utilisateur de sélectionner une image de N'IMPORTE LEQUEL des formats supportés, car sélectionner le format correct avant de sélectionner l'image est assez fastidieux . Quelle est la solution la plus élégante pour y parvenir, sans sous-classer les classes Qt impliquées?

+0

setMimeTypeFilters utilise simplement QMimeType :: filterString pour chaque type mime. Vous pouvez le faire vous-même, puis ajouter une autre chaîne que vous générez à partir de la concaténation des suffixes QMimeType :: pour tous les types MIME pris en charge. Pas une solution élégante cependant. Je ne sais pas non plus à quoi cela ressemblera dans la boîte de dialogue puisque le nombre d'extensions de fichiers sera assez important. – SteakOverflow

Répondre

1

Merci au commentaire de SteakOverflow, voici la solution que je suis venu avec:

// get supported image file types 
QStringList mimeTypeFilters; 
const QByteArrayList supportedMimeTypes = QImageReader::supportedMimeTypes(); 
foreach(const QByteArray& mimeTypeName, supportedMimeTypes) { 
    mimeTypeFilters.append(mimeTypeName); 
} 
mimeTypeFilters.sort(Qt::CaseInsensitive); 

// compose filter for all supported types 
QMimeDatabase mimeDB; 
QStringList allSupportedFormats; 
for(const QString& mimeTypeFilter: mimeTypeFilters) { 
    QMimeType mimeType = mimeDB.mimeTypeForName(mimeTypeFilter); 
    if(mimeType.isValid()) { 
     allSupportedFormats.append(mimeType.globPatterns()); 
    } 
} 
QString allSupportedFormatsFilter = QString("All supported formats (%1)").arg(allSupportedFormats.join(' ')); 

QFileDialog* fileDialog = new QFileDialog(this, "Select image"); 
fileDialog->setFileMode(QFileDialog::ExistingFile); 
fileDialog->setMimeTypeFilters(mimeTypeFilters); 
QStringList nameFilters = fileDialog->nameFilters(); 
nameFilters.append(allSupportedFormatsFilter); 
fileDialog->setNameFilters(nameFilters); 
fileDialog->selectNameFilter(allSupportedFormatsFilter); 

Il est fondamentalement la même mise en œuvre QFileDialog utilise en interne pour convertir les filtres de type MIME pour les filtres de nom. Le nouveau filtre de nom pour tous les formats pris en charge sera ajouté au bas de la liste de filtres et présélectionné. La chaîne de filtre est assez longue et pas entièrement visible dans la boîte de dialogue à la fois, mais deviendra entièrement visible une fois que l'utilisateur ouvre le menu déroulant.