2017-09-24 105 views
1

我使用Qt 5.9打開文件對話框,要求用戶選擇一個圖像文件:QFileDialog結合MIME類型過濾器,以「全格式」

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類進行子類化?

+0

setMimeTypeFilters只爲每個MIME類型使用QMimeType :: filterString。你可以自己做,然後添加另一個字符串,通過連接所有支持的MIME類型的QMimeType :: suffixes生成。雖然不是一個優雅的解決方案由於文件擴展名的數量很大,我也不知道它在實際對話框中的樣子。 – SteakOverflow

回答

1

由於SteakOverflow的評論,這裏是我想出瞭解決方案:

// 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類型的過濾器轉換爲名稱的過濾器。所有支持格式的新名稱過濾器將添加到過濾器列表的底部並預選。過濾器字符串非常長,並且在對話框中不能完全顯示,但是一旦用戶打開下拉菜單,就會變得完全可見。