QFileDialog将MIME类型过滤器组合为“所有格式”

时间:2017-09-24 16:48:05

标签: c++ qt mime-types openfiledialog

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

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类?

1 个答案:

答案 0 :(得分: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类型过滤器转换为名称过滤器的实现相同。所有支持格式的新名称过滤器将添加到过滤器列表的底部并预先选择。过滤器字符串很长,并且在对话框中不会完全可见,但是一旦用户打开下拉菜单,它就会变得完全可见。