2010-04-08 64 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