2013-06-18 2 views
1

Я использую QFileSystemModel с QListview для отображения всех файлов из каталога. Я хотел бы, чтобы фильтровать эту модель для отображения некоторых категорий файлов, таких как:Фильтрация QFilesystemModel

  • текстовых файлов: * .txt * .csv * .tab
  • музыка: * .mp3 * .flac * .ogg
  • фильмы: * .avi * .mkv

Мой текущий код:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    Filemodel = new QFileSystemModel(this)      ; 
    Filemodel->setFilter(QDir::NoDotAndDotDot | QDir::Files) ; 
    proxy_model = new QSortFilterProxyModel(); 

    proxy_model ->setDynamicSortFilter(true); 
    proxy_model ->setSourceModel(Filemodel); 
    proxy_model ->setFilterKeyColumn(0); 
    ui->Filtered_tbView->setModel(proxy_model)    ; 
} 

(...)

/* combobox event to select file type to filter */ 
void MainWindow::on_FSFilter_Combo_currentIndexChanged(int index) 
{ 
proxy_model->setFilterWildcard("*.txt"); // just a simple example here 
ui->Filtered_tbView->setModel(proxy_model)    ; 
} 

Этот код не отображает ничего, в то время как все типы файлов присутствуют в каталоге.

Кроме того, вещи, которые я пробовал, что не было хорошо для меня (указатели могут быть полезны для дальнейших читателей):

  • setNameFilters: хорошо работать, но позволяет показать все файлы (нефильтрованный просто неактивны)
  • the Custom Sort/Filter Model Example -> при использовании QSortFilterProxyModel этот пример несколько сложный, чтобы просто отфильтровать расширения файла, кроме того, он использует regexp, что не самый лучший метод при использовании множества фильтров, подобных здесь.
  • Я также нашел interesting snippet from qt-project но не смогли узнать, как реализовать его для строк с несколькими расширениями

ответ

7

Самый простой способ заключается в использовании QFileSystemModel::setNameFilters.

С помощью свойства QFileSystemModel::nameFilterDisables вы можете выбрать между отфильтрованными файлами, которые были отключены или скрыты.

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    Filemodel = new QFileSystemModel(this)      ; 
    Filemodel->setFilter(QDir::NoDotAndDotDot | QDir::Files) ; 

    QStringList filters; 
    filters << "*.txt"; 

    Filemodel.setNameFilters(filters); 
    Filemodel.setNameFilterDisables(false); 

    ui->Filtered_tbView->setModel(Filemodel)     ; 
} 
Смежные вопросы