有没有办法在QFileDialog上设置不区分大小写的过滤器。
我尝试了文档中的示例:
QStringList mimeTypeFilters;
mimeTypeFilters << "image/jpeg" // will show "JPEG image (*.jpeg *.jpg *.jpe)
<< "image/png" // will show "PNG image (*.png)"
<< "application/octet-stream"; // will show "All files (*)"
QFileDialog dialog(this);
dialog.setMimeTypeFilters(mimeTypeFilters);
dialog.exec();
但是该对话框在 Linux 上仅显示文件扩展名较低的 jpeg。
使用setNameFilter
也不起作用。
编辑
此问题仅出现在 nativ (Ubuntu) 文件对话框中。设置以下选项可以解决问题,但如果它也适用于 nativ 文件对话框,那就太好了。
dialog.setOption(QFileDialog::DontUseNativeDialog, true);
https://bugreports.qt.io/browse/QTBUG-51712
因为setMimeTypeFilters
是setNameFilters
周围的一个方便的实用程序,所以你可以阅读后者的文档。
据说:
setMimeTypeFilters的优点是为每种文件类型提供所有可能的名称筛选器。例如,JPEG 图像有三个可能的扩展名
这些扩展名是您为 JPEG 列出的扩展名,小写。
无论如何,根据定义,mime 类型不区分大小写:
类型、子类型和参数名称不区分大小写。例如,TEXT、Text 和 TeXt 都是等效的顶级媒体类型。
也就是说,这似乎是Qt的一个特质。文件对话框希望用户将接受的类型列为正则表达式,内部定义的 mime 类型将这些类型定义为小写,因此即使 RFC 声明相反,它也无法在大写时获取它们。
正如你所做的那样,你是对的:mime 类型的类型和子类型不区分大小写,所以你希望匹配 jpg 和 JPG。
祝你好运。
我可能会在Qt跟踪器上打开一个错误,以了解他们对此的看法。
编辑
如评论中所述,mime 类型不区分大小写的事实实际上不会影响文件扩展名。
因此,即使image/jpeg
和image/JPEG
相同,也没有什么可以强制框架一起考虑.jpg
和.JPG
文件。
回到文档中的示例,我们有以下内容:
mimeTypeFilters << "image/jpeg" // will show "JPEG image (*.jpeg *.jpg *.jpe)
<< "image/png" // will show "PNG image (*.png)"
<< "application/octet-stream"; // will show "All files (*)"
在这里,它指出,对于 mime 类型 image/jpeg
(无论它被覆盖),接受的扩展名都设置为 jpeg
和其他扩展名。
另外,我会再次引用文档中的内容:
例如,JPEG 图像有三个可能的扩展名
这些扩展显然是jpeg
、jpg
和jpe
、小写的。
因此,我仍然认为这是Qt处理该问题的方式中的一个错误,但是可以争辩说,问题在于您实际上正在使用的扩展未被MIME类型的内部映射考虑
你如何尝试使用名称过滤器?它应该是这样的:
QFileDialog f(0, tr("Select file(s)"),QDir::homePath(),
tr("Audio files(*.mp3 *.ogg *.wav *.flac);;All files(*)"));