Qt:如何在QFileDialog上设置不区分大小写的过滤器



有没有办法在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

因为setMimeTypeFilterssetNameFilters周围的一个方便的实用程序,所以你可以阅读后者的文档。

据说:

setMimeTypeFilters的优点是为每种文件类型提供所有可能的名称筛选器。例如,JPEG 图像有三个可能的扩展名

这些扩展名是您为 JPEG 列出的扩展名,小写。
无论如何,根据定义,mime 类型不区分大小写:

类型、子类型和参数名称不区分大小写。例如,TEXT、Text 和 TeXt 都是等效的顶级媒体类型。

也就是说,这似乎是Qt的一个特质。文件对话框希望用户将接受的类型列为正则表达式,内部定义的 mime 类型将这些类型定义为小写,因此即使 RFC 声明相反,它也无法在大写时获取它们。

正如你所做的那样,你是对的:mime 类型的类型和子类型不区分大小写,所以你希望匹配 jpg 和 JPG。

祝你好运。

我可能会在Qt跟踪器上打开一个错误,以了解他们对此的看法。

编辑

如评论中所述,mime 类型不区分大小写的事实实际上不会影响文件扩展名。
因此,即使image/jpegimage/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 图像有三个可能的扩展名

这些扩展显然是jpegjpgjpe、小写的。

因此,我仍然认为这是Qt处理该问题的方式中的一个错误,但是可以争辩说,问题在于您实际上正在使用的扩展未被MIME类型的内部映射考虑

你如何尝试使用名称过滤器?它应该是这样的:

QFileDialog f(0, tr("Select file(s)"),QDir::homePath(),
              tr("Audio files(*.mp3 *.ogg *.wav *.flac);;All files(*)"));

相关内容

  • 没有找到相关文章