QFileDialog 将 MIME 类型过滤器组合到 "All formats"

QFileDialog combine MIME type filters to "All formats"

我正在使用 Qt 5.9 打开一个文件对话框,要求用户select 一个图像文件:

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 类型过滤器添加到对话框中,效果很好。但是,我想添加一个额外的过滤器(例如 "All formats" 或 "All supported"),允许用户 select 任何支持格式的图像,如 selecting select 图像之前的正确格式非常乏味。实现这一目标的最优雅的解决方案是什么,而无需子类化任何相关的 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 类型过滤器转换为名称过滤器的实现基本相同。所有支持格式的新名称过滤器将添加到过滤器列表的底部并被预选。筛选器字符串很长,不会立即在对话框中完全显示,但一旦用户打开下拉菜单就会完全显示。