Фильтр регулярных выражений для QFileDialog
Я хотел бы отобразить диалог открытия файла, который фильтрует по определенному шаблону, например *.000
в *.999
,
QFileDialog::getOpenFileNames
позволяет указать дискретные фильтры, такие как *.000
, *.001
и т.д. Я хотел бы установить регулярное выражение в качестве фильтра, в этом случае ^.*\.\d\d\d$
, т.е. любое имя файла, которое имеет трехзначное расширение.
2 ответа
Решение
Аривез указал мне в правильном направлении. Главное, что нужно остерегаться, это позвонить 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. Это объясняется здесь: фильтрация в QFileDialog