2010-04-08 58 views
5

我希望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); 
} 

回答

0

您可以使用QFileDialog::setProxyModel过滤MIME类型。您可能想要继承QSortFilterProxyModel的子类并覆盖filterAcceptsRow,以便仅在文件具有适当的MIME类型时才接受。希望这一点能够以一种简单的方式来识别文件的MIME类型,这将是一个很好的解决方案。

+0

不错,这是一个很好的解决方案。然而,据我所知,有两个缺点。 一个小问题,就是对话框中的过滤器下拉框不会被允许的文件类型填充。但是,您可能只需在其中添加一些描述性文字。就像我的情况“音频文件”一样。 更严重的缺点是不能再使用本机文件对话框。这对我来说是一个阻碍,我的最终解决方案是将mime.types文件发布到我的应用程序中,但我讨厌它!如果你不关心本地对话,在我看来这是更好的解决方案。因此,我将其标记为正确答案。 – Mathias 2010-04-21 18:24:45

+0

是的,本地文件对话框有其优点和问题。它们比Qt对话框(尤其是网络共享和收藏夹)更可靠,但您无法像使用Qt对话框一样自定义按钮文本和其他内容。 WRT下拉过滤器,你是对的。我很好奇,如果在代理模型投入使用后文件是基于扩展名进行过滤的,但还没有测试知道。 – 2010-04-21 20:27:10

0

呼叫availableMimeTypes(),然后遍历得到的MIME类型列表和每个列表枚举QMimeType::extensions()返回的扩展。

+0

QMimeType不是Qt的一部分,而是QT扩展库的一部分。对于如此小的任务,这是一个相当大的图书馆。但我查看了qmimetype.cpp的源代码,看看他们做了什么。不幸的是,它似乎只是GNU/Linux的库。他们找到扩展的方式就是从/etc/mime.types中提取它们,这不是跨平台的。 – Mathias 2010-04-08 19:14:06

+0

不顾以前的评论,这是错误的! 事实证明,Qt Extended实际上会自带mime.types文件,因此上面的答案中提到的方法是跨平台的。但不好。 我可以关闭只是创建一个类似的文件,但保持它是工作。更重要的是,这个文件必然是不完整的,并且会怀念mime类型。这是操作系统已经知道的信息(事实上只有操作系统知道,并且只在运行时),所以除了询问操作系统之外什么都不是好的解决方案。因此我仍在寻找解决这个问题的办法。 – Mathias 2010-04-09 13:45:30