2010-04-08 19 views
5

से QFileDialog फ़िल्टर मैं चाहता हूं कि फ़ॉफ़ोन द्वारा समर्थित सभी ऑडियो फ़ाइल प्रकारों से मेल खाने के लिए फ़िल्टर को QFileDialog में फ़िल्टर करना चाहिए।माइम-प्रकार

1 - हालांकि मैं फ़िल्टर में माइम प्रकारों का उपयोग करने के लिए क्यूटी में कोई रास्ता नहीं ढूंढ पा रहा हूं। मैं उसे कैसे कर सकता हूँ?

2 - या मैं मैन्युअल रूप से mimetypes के लिए संबंधित फ़ाइल एक्सटेंशन कैसे प्राप्त कर सकता हूं? समाधान क्यूटी आधारित होना चाहिए, या कम से कम क्रॉस प्लेटफॉर्म होना चाहिए और हर जगह क्यूटी है।

#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 के साथ माइम प्रकारों पर फ़िल्टर कर सकते हैं। आप शायद QSortFilterProxyModel उप-वर्ग करना चाहते हैं और filterAcceptsRow ओवरराइड कर सकते हैं ताकि यह केवल तब स्वीकार हो जब फ़ाइल उपयुक्त माइम-प्रकार का हो। उम्मीद है कि, जब फ़ाइल के माइम-प्रकारों की पहचान करने के लिए एक आसान तरीका है, तो यह एक अच्छा समाधान के रूप में कार्य करेगा।

+0

अच्छा, यह एक अच्छा समाधान है। जहां तक ​​मैं देख सकता हूं वहां दो दोष हैं। एक मामूली, यह है कि संवाद में फ़िल्टर ड्रॉपडाउन बॉक्स को अनुमति फ़ाइल प्रकारों से भरा नहीं जाएगा। हालांकि आप शायद कुछ वर्णनात्मक पाठ डाल सकते हैं। मेरे मामले में "ऑडियो फाइलें" की तरह। एक और गंभीर दोष यह है कि आप अब मूल फ़ाइल संवाद का उपयोग नहीं कर सकते हैं। यह मेरे लिए एक शो स्टॉपर है और मेरा अंतिम (?) समाधान मेरे आवेदन के साथ mime.types फ़ाइल को शिप करना है, लेकिन मुझे इससे नफरत है! यदि आपको मूल संवाद की परवाह नहीं है तो यह मेरी राय में एक बेहतर समाधान है। इसलिए मैं इसे सही उत्तर के रूप में चिह्नित करता हूं। – Mathias

+0

हाँ, मूल फ़ाइल संवाद के उनके लाभ और उनकी समस्याएं हैं। वे क्यूटी संवाद (विशेष रूप से नेटवर्क शेयरों और पसंदीदा के साथ) से अधिक विश्वसनीय हैं, लेकिन आप क्यूटी संवाद के साथ बटन टेक्स्ट और अन्य चीजों को कस्टमाइज़ नहीं कर सकते हैं। डब्लूआरटी ड्रॉपडाउन फ़िल्टर, आप सही हैं। मुझे उत्सुकता है कि फ़ाइलों को प्रॉक्सी मॉडल के बाद विस्तार के आधार पर फ़िल्टर किया गया है, लेकिन निश्चित रूप से जानने के लिए परीक्षण नहीं किया गया है। –

0

फ़ोनॉन बैकएंड पर कॉल availableMimeTypes() और फिर पाश के माध्यम से:

विकल्प एक मेरी पसंदीदा समाधान, तथापि विकल्प दो के रूप में अच्छी तरह से करना होगा ..

के बाद एक छोटी कोड मेरी समस्या का वर्णन किया गया है परिणामी एमआईएम-प्रकार सूची और प्रत्येक के लिए QMimeType::extensions() द्वारा लौटाए गए एक्सटेंशन की गणना करें।

+0

QMimeType Qt का हिस्सा नहीं है, लेकिन लाइब्रेरी QT विस्तारित का हिस्सा है। इस तरह के एक छोटे से काम के लिए जो एक बड़ी पुस्तकालय है। लेकिन मैंने यह देखने के लिए qmimetype.cpp के स्रोत कोड में देखा कि उन्होंने क्या किया। दुर्भाग्यवश ऐसा लगता है कि लाइब्रेरी केवल जीएनयू/लिनक्स है। वे एक्सटेंशन को जिस तरह से ढूंढते हैं उन्हें बस /etc/mime.types से निकालने के लिए है, जो क्रॉस प्लेटफॉर्म नहीं है। – Mathias

+0

पिछली टिप्पणी को अनदेखा करें, यह गलत है! यह पता चला है कि वास्तव में क्यूटी विस्तारित अपनी खुद की mime.types फ़ाइल भेजती है, इसलिए ऊपर दिए गए उत्तर में उल्लिखित विधि क्रॉस प्लेटफ़ॉर्म है। लेकिन अच्छा नहीं है। मैं सिर्फ एक ही फाइल बनाने के कारण बंद कर सकता हूं, लेकिन इसे बनाए रखना काम है। और अधिक महत्वपूर्ण फ़ाइल अपूर्ण होने के लिए बाध्य है, और मिस-प्रकार याद आती है। यह जानकारी है कि ऑपरेशन सिस्टम पहले से ही जानता है (वास्तव में केवल ओएस जानता है, और केवल रन-टाइम पर), इसलिए ओएस पूछने पर कुछ भी अच्छा समाधान नहीं है। इसलिए मैं अभी भी इस समस्या का हल ढूंढ रहा हूं। – Mathias

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^