2017-09-24 78 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类型的过滤器转换为名称的过滤器。所有支持格式的新名称过滤器将添加到过滤器列表的底部并预选。过滤器字符串非常长,并且在对话框中不能完全显示,但是一旦用户打开下拉菜单,就会变得完全可见。