QFileDialog结合MIME类型过滤器,以“全格式”
问题描述:
我使用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类进行子类化?
答
由于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类型的过滤器转换为名称的过滤器。所有支持格式的新名称过滤器将添加到过滤器列表的底部并预选。过滤器字符串非常长,并且在对话框中不能完全显示,但是一旦用户打开下拉菜单,就会变得完全可见。
setMimeTypeFilters只为每个MIME类型使用QMimeType :: filterString。你可以自己做,然后添加另一个字符串,通过连接所有支持的MIME类型的QMimeType :: suffixes生成。虽然不是一个优雅的解决方案由于文件扩展名的数量很大,我也不知道它在实际对话框中的样子。 – SteakOverflow