2

QListviewQFileSystemModelを使用して、ディレクトリからすべてのファイルを表示しています。そのモデルをフィルタリングして、次のようなファイルのカテゴリを表示したいと思います。

  • テキストファイル: *.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 : うまく機能しますが、すべてのファイルを表示できます (フィルタリングされていないものはグレー表示されます)。
  • カスタム ソート/フィルター モデルの例-> QSortFilterProxyModel を使用している間、この例はやや複雑すぎて、ファイル拡張子を除外するだけでは済みません。さらに、ここのように多くのフィルターを使用する場合に最適な方法ではない正規表現を使用しています。
  • qt-project から興味深いスニペットも見つけましたが、複数の拡張子を持つ行に実装する方法を見つけることができませんでした
4

1 に答える 1

9

最も簡単な方法は、 を使用すること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 )                  ;
}
于 2013-06-20T12:28:54.317 に答える