سؤال

أريد أن يتطابق المرشح في QFileDialog من مطابقة جميع أنواع الملفات الصوتية التي يدعمها Phonon على النظام الأساسي المعني.

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 مع QFileDialog::setProxyModel. ربما ستحتاج إلى فئة فرعية QSortFilterProxyModel والتجاوز filterAcceptsRowبحيث يقبل فقط عندما يكون الملف من نوع MIME المناسب. نأمل أن يكون هذا ، عند ربط طريقة سهلة لتحديد أنواع التمرير ، بمثابة حل جيد.

نصائح أخرى

يتصل availableMimeTypes() على الواجهة الخلفية الفونون ثم حلقة من خلال قائمة نوع MIME الناتجة ولكل واحد يعدد الإضافات التي تم إرجاعها بواسطة QMimeType::extensions().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top