2010-04-08 32 views
5

Tôi muốn bộ lọc trong QFileDialog khớp với tất cả các loại tệp âm thanh được Phonon hỗ trợ trên nền tảng được đề cập.Bộ lọc QFileDialog từ các loại mime

1 - Tuy nhiên tôi không thể tìm cách trong Qt để sử dụng loại mime trong bộ lọc. Làm thế nào tôi có thể làm điều đó?

2 - Hoặc làm cách nào tôi có thể tìm thấy các phần mở rộng tệp tương ứng cho các mimetypes theo cách thủ công? Giải pháp nên dựa trên Qt, hoặc ít nhất là nền tảng chéo và được hỗ trợ ở mọi nơi Qt.

Lựa chọn một giải pháp là tôi ưa thích, tuy nhiên tuỳ chọn hai sẽ làm mọi việc tốt ..

Sau đây là một mã ngắn mô tả vấn đề của tôi:

#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); 
} 

Trả lời

0

Bạn có thể lọc loại mime bằng QFileDialog::setProxyModel. Có thể bạn sẽ muốn phân lớp QSortFilterProxyModel và ghi đè filterAcceptsRow để chỉ chấp nhận khi tệp thuộc loại mime thích hợp. Hy vọng rằng điều này, khi bị ràng buộc với một cách dễ dàng để xác định một loại mime của tập tin, sẽ phục vụ như là một giải pháp tốt.

+0

Đẹp, đây là một giải pháp tốt. Tuy nhiên có hai nhược điểm xa như tôi có thể thấy. Một nhỏ, là hộp thả xuống bộ lọc trong hộp thoại sẽ không được lấp đầy với các loại tệp được cho phép. Tuy nhiên bạn có thể chỉ cần đặt một số văn bản mô tả ở đó. Giống như trong trường hợp của tôi "tệp âm thanh". Hạn chế nghiêm trọng hơn là bạn không thể sử dụng hộp thoại tệp gốc nữa. Đây là một stopper hiển thị cho tôi và giải pháp cuối cùng (?) Của tôi là gửi một tập tin mime.types với ứng dụng của tôi, nhưng tôi ghét nó! Nếu bạn không quan tâm đến hộp thoại bản địa thì đây là giải pháp tốt hơn theo ý kiến ​​của tôi. Do đó tôi đánh dấu nó như một câu trả lời đúng. – Mathias

+0

Vâng, hộp thoại tệp gốc có lợi ích và vấn đề của chúng. Chúng đáng tin cậy hơn các hộp thoại Qt (đặc biệt là với các chia sẻ mạng và các mục yêu thích), nhưng bạn không thể tùy chỉnh văn bản nút và những thứ khác như bạn có thể làm với các hộp thoại Qt. Bộ lọc thả xuống WRT, bạn nói đúng. Tôi tò mò nếu các tập tin được lọc dựa trên phần mở rộng sau khi một mô hình proxy được đưa ra, nhưng chưa thử nghiệm để biết chắc chắn. –

0

Gọi availableMimeTypes() trên thì Phonon phụ trợ và sau đó lặp qua danh sách loại MIME kết quả và cho mỗi danh sách liệt kê các tiện ích mở rộng được trả về bởi QMimeType::extensions().

+0

QMimeType không thuộc Qt, mà là một phần của thư viện QT Extended. Đó là một thư viện khá lớn cho một nhiệm vụ nhỏ như vậy. Nhưng tôi đã xem xét mã nguồn của qmimetype.cpp để xem họ đã làm gì. Thật không may có vẻ như thư viện chỉ là GNU/Linux. Cách họ tìm thấy các phần mở rộng chỉ là để trích xuất chúng từ /etc/mime.types, mà không phải là nền tảng chéo. – Mathias

+0

Bỏ qua nhận xét trước, điều đó là sai! Nó chỉ ra rằng Qt mở rộng trong thực tế tàu tập tin mime.types riêng của mình, do đó phương pháp được đề cập trong câu trả lời trên là nền tảng chéo. Nhưng không tốt. Tôi có thể tắt nguyên nhân chỉ cần tạo một tệp tương tự, nhưng duy trì nó hoạt động. Và quan trọng hơn là tệp bị ràng buộc là không đầy đủ và bỏ lỡ các loại mime. Thông tin IS này mà hệ điều hành đã biết (trên thực tế chỉ có hệ điều hành biết, và chỉ vào thời gian chạy), vì vậy bất cứ điều gì nhưng yêu cầu hệ điều hành không phải là một giải pháp tốt. Vì vậy, tôi vẫn đang tìm kiếm một giải pháp cho vấn đề này. – Mathias