【发布时间】:2017-06-19 03:32:41
【问题描述】:
我想显示一个过滤特定模式的文件打开对话框,例如 *.000 到 *.999。
QFileDialog::getOpenFileNames允许你指定离散过滤器,例如*.000、*.001等。我想设置一个正则表达式作为过滤器,在这种情况下^.*\.\d\d\d$,即任何文件名三位数的扩展名。
【问题讨论】:
标签: qt fileopendialog qregularexpression
我想显示一个过滤特定模式的文件打开对话框,例如 *.000 到 *.999。
QFileDialog::getOpenFileNames允许你指定离散过滤器,例如*.000、*.001等。我想设置一个正则表达式作为过滤器,在这种情况下^.*\.\d\d\d$,即任何文件名三位数的扩展名。
【问题讨论】:
标签: qt fileopendialog qregularexpression
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
【讨论】:
filterAcceptsRow 永远不会被调用。