QFileDialog 的正则表达式过滤器
Regular Expression Filter for QFileDialog
我想显示一个按特定模式过滤的文件打开对话框,例如 *.000
到 *.999
。
QFileDialog::getOpenFileNames
允许您指定离散过滤器,例如 *.000
、*.001
等。我想将正则表达式设置为过滤器,在本例中为 ^.*\.\d\d\d$
,即具有三位数扩展名的任何文件名。
可以通过在QFileDialog中添加代理模型来实现。在这里解释:Filtering in QFileDialog
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();
我想显示一个按特定模式过滤的文件打开对话框,例如 *.000
到 *.999
。
QFileDialog::getOpenFileNames
允许您指定离散过滤器,例如 *.000
、*.001
等。我想将正则表达式设置为过滤器,在本例中为 ^.*\.\d\d\d$
,即具有三位数扩展名的任何文件名。
可以通过在QFileDialog中添加代理模型来实现。在这里解释:Filtering in QFileDialog
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();