*.000
から*.999
のように、特定のパターンをフィルタリングするファイルを開くダイアログを表示したいとします。QFileDialogの正規表現フィルタ
QFileDialog::getOpenFileNames
は、私は、この場合^.*\.\d\d\d$
には、3桁の拡張子を持つ、すなわち任意のファイル名をフィルタとしての正規表現を設定したいなど*.000
、*.001
、など個別のフィルタを、指定することができます。
*.000
から*.999
のように、特定のパターンをフィルタリングするファイルを開くダイアログを表示したいとします。QFileDialogの正規表現フィルタ
QFileDialog::getOpenFileNames
は、私は、この場合^.*\.\d\d\d$
には、3桁の拡張子を持つ、すなわち任意のファイル名をフィルタとしての正規表現を設定したいなど*.000
、*.001
、など個別のフィルタを、指定することができます。
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();
QFileDialogにプロキシモデルを追加することで行うことができます。ここで説明されています:Filtering in QFileDialog
Qtのドキュメントによると、これは動作するはずです。上記のリンクの指示に従っていますが、サブクラスの 'filterAcceptsRow'は決して呼び出されません。 – Frank
Qt 5.4.1、Win 10、VS 2013を使用しています。 – Frank
Qt5とVSのdialog.setProxyModel(&filter)は動作していません。dialog.proxyModel()はnullのままなので、フィルタリングは行われません。 – ariwez