gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:28:39 24 4
gpt4 key购买 nike

我正在使用 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 类进行子类化的情况下实现这一目标的最优雅解决方案是什么?

最佳答案

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

关于c++ - QFileDialog 将 MIME 类型过滤器组合到 "All formats",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46392460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com