2017-09-24 4 views
1

私は、画像ファイルを選択するようにユーザに尋ねるファイルダイアログを開くためにはQt 5.9を使用していますし、MIMEタイプのフィルタを組み合わせる:QFileDialogは「すべてのフォーマット」

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(); 

すべてのサポートされているイメージ形式はへのMIMEタイプフィルタとして追加されますこのダイアログは非常にうまく動作しています。ただし、画像を選択する前に正しいフォーマットを選択すると、サポートされているフォーマットのいずれかの画像を選択できるようにする追加のフィルタ(「すべてのフォーマット」や「すべてサポート」など)を追加したい。どのようなQtクラスをサブクラス化することなく、これを達成する最も洗練されたソリューションは何ですか? SteakOverflowさんのコメントに

+0

setMimeTypeFiltersは、各MIMEタイプに対してQMimeType :: filterStringを使用します。これを自分で行い、サポートされているすべてのMIMEタイプに対してQMimeType ::サフィックスを連結して生成する別の文字列を追加できます。しかし、エレガントなソリューションではありません。ファイル拡張子の数がかなり多いので、実際のダイアログでどのように見えるかもわかりません。 – SteakOverflow

答えて

1

おかげで、ここで私が思いついた解決策は以下のとおりです。

// 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); 

それは基本的にQFileDialogは、名前フィルタにMIMEタイプのフィルタを変換するために内部的に使用するのと同じ実装です。サポートされているすべてのフォーマットの新しい名前フィルタは、フィルタリストの一番下に追加され、あらかじめ選択されています。フィルタ文字列はかなり長く、一度にダイアログに完全に表示されませんが、ユーザーがドロップダウンメニューを開くと完全に表示されます。

関連する問題