2017-02-02 9 views
0

*.000から*.999のように、特定のパターンをフィルタリングするファイルを開くダイアログを表示したいとします。QFileDialogの正規表現フィルタ

QFileDialog::getOpenFileNamesは、私は、この場合^.*\.\d\d\d$には、3桁の拡張子を持つ、すなわち任意のファイル名をフィルタとしての正規表現を設定したいなど*.000*.001、など個別のフィルタを、指定することができます。

答えて

0

ariwezは正しい方向に私を指摘しました。注意すべき主な点は、dialog.setOption(QFileDialog::DontUseNativeDialog)の前にdialog.setProxyModelと呼ぶことです。

プロキシモデルは次のように

class FileFilterProxyModel : public QSortFilterProxyModel 
{ 
protected: 
    virtual bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const 
    { 
     QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
     QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel()); 

     // I don't want to apply the filter on directories. 
     if (fileModel == nullptr || fileModel->isDir(index0)) 
      return true; 

     auto fn = fileModel->fileName(index0); 

     QRegExp rx(".*\\.\\d\\d\\d"); 
     return rx.exactMatch(fn); 
    } 
}; 

ファイルダイアログが作成されます。

QFileDialog dialog; 

// Call setOption before setProxyModel. 
dialog.setOption(QFileDialog::DontUseNativeDialog); 
dialog.setProxyModel(new FileFilterProxyModel); 
dialog.exec(); 
1

QFileDialogにプロキシモデルを追加することで行うことができます。ここで説明されています:Filtering in QFileDialog

+0

Qtのドキュメントによると、これは動作するはずです。上記のリンクの指示に従っていますが、サブクラスの 'filterAcceptsRow'は決して呼び出されません。 – Frank

+0

Qt 5.4.1、Win 10、VS 2013を使用しています。 – Frank

+0

Qt5とVSのdialog.setProxyModel(&filter)は動作していません。dialog.proxyModel()はnullのままなので、フィルタリングは行われません。 – ariwez