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 类型过滤器转换为名称过滤器的实现基本相同。所有支持格式的新名称过滤器将添加到过滤器列表的底部并被预选。筛选器字符串很长,不会立即在对话框中完全显示,但一旦用户打开下拉菜单就会完全显示。
我正在使用 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 类型过滤器转换为名称过滤器的实现基本相同。所有支持格式的新名称过滤器将添加到过滤器列表的底部并被预选。筛选器字符串很长,不会立即在对话框中完全显示,但一旦用户打开下拉菜单就会完全显示。