我希望QFileDialog中的过滤器匹配有问题的平台上的Phonon支持的所有音频文件类型。MIME类型的QFileDialog过滤器
1 - 但是我无法找到一种方式在Qt中使用过滤器中的MIME类型。我怎样才能做到这一点?
2 - 或者如何手动找到mimetypes的相应文件扩展名?解决方案应该是基于Qt的,或者至少是跨平台的,并且Qt是无处不在的。
选项一个是我的首选解决方案,但是方案二也将这样做..
以下是描述我的问题很短的代码:在声子后端
#include <QApplication>
#include <QFileDialog>
#include <QStringList>
#include <phonon/backendcapabilities.h>
QStringList mime_to_exts(QString mime)
{
// WHAT TO REALLY DO ??
// NEEDLESS TO SAY; THIS IS WRONG...
return QStringList(mime.split("/").back().split('-').back());
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
app.setApplicationName("phononext");
QStringList p_audio_exts;
QStringList p_mime_types = Phonon::BackendCapabilities::availableMimeTypes();
for(QStringList::iterator i = p_mime_types.begin(), ie = p_mime_types.end(); i != ie; i++)
{
if((*i).startsWith("audio"))
p_audio_exts << mime_to_exts(*i);
}
QString filter = QString("All Files(*)");
if(!p_audio_exts.isEmpty())
{
QString p_audio_filter = QString("Audio Files (*.%1)").arg(p_audio_exts.join(" *."));
filter = QString("%1;;%2").arg(p_audio_filter).arg(filter);
}
QFileDialog::getOpenFileName(NULL, "Open Audio File", QString(), filter);
}
不错,这是一个很好的解决方案。然而,据我所知,有两个缺点。 一个小问题,就是对话框中的过滤器下拉框不会被允许的文件类型填充。但是,您可能只需在其中添加一些描述性文字。就像我的情况“音频文件”一样。 更严重的缺点是不能再使用本机文件对话框。这对我来说是一个阻碍,我的最终解决方案是将mime.types文件发布到我的应用程序中,但我讨厌它!如果你不关心本地对话,在我看来这是更好的解决方案。因此,我将其标记为正确答案。 – Mathias 2010-04-21 18:24:45
是的,本地文件对话框有其优点和问题。它们比Qt对话框(尤其是网络共享和收藏夹)更可靠,但您无法像使用Qt对话框一样自定义按钮文本和其他内容。 WRT下拉过滤器,你是对的。我很好奇,如果在代理模型投入使用后文件是基于扩展名进行过滤的,但还没有测试知道。 – 2010-04-21 20:27:10