2010-04-08 3 views
5

QFileDialog의 필터를 해당 플랫폼의 Phonon에서 지원하는 모든 오디오 파일 유형과 일치 시키길 원합니다.mime-types의 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

+0

네, 네이티브 파일 대화 상자는 장점과 문제점을 가지고 있습니다. Qt 대화 상자 (특히 네트워크 공유 및 즐겨 찾기)보다 더 안정적이지만 Qt 대화 상자에서 할 수있는 것처럼 단추 텍스트와 다른 것들을 사용자 정의 할 수는 없습니다. WRT 드롭 다운 필터, 맞습니다. 프록시 모델을 설치 한 후 확장명을 기준으로 파일을 필터링하는 것이 궁금합니다. 그러나 확실히 알고 테스트하지는 않았습니다. –

0

포논 백엔드에 전화 availableMimeTypes() 및 루프를 통해 :

옵션 하나는 내 문제를 설명하는 짧은 코드에 따라 내 선호하는 솔루션, 두뿐만 아니라 할 것입니다 그러나 옵션 ..

입니다 결과 MIME 형식 목록과 각각에 대해 QMimeType::extensions()이 반환하는 확장명을 열거합니다.

+0

QMimeType은 Qt의 일부가 아니지만 QT Extended 라이브러리의 일부입니다. 작은 작업을하기에 꽤 큰 도서관입니다. 그러나 qmimetype.cpp의 소스 코드를 살펴보고 그들이 한 일을 확인했습니다. 불행하게도이 라이브러리는 GNU/Linux에서만 사용됩니다. 확장 기능을 찾는 방법은 크로스 플랫폼이 아닌 /etc/mime.types에서 파일을 추출하는 것입니다. – Mathias

+0

이전 댓글을 무시하십시오. 잘못되었습니다! 실제로 Qt Extended는 자체 mime.types 파일을 제공하므로, 위의 대답에서 언급 한 방법은 크로스 플랫폼입니다. 그러나 좋지 않다. 비슷한 파일을 만들 수도 있지만이를 유지하는 것은 효과가 있습니다. 더 중요한 것은 파일이 불완전하게 바인딩되어 있고 MIME 형식이 잘못되었습니다. 이것은 운영 시스템이 이미 알고있는 정보입니다 (실제로는 OS가 알고 있고 런타임에만 필요합니다). 따라서 OS를 묻는 것 외에는 좋은 해결책이 아닙니다. 따라서 나는 아직도이 문제에 대한 해결책을 찾고있다. – Mathias