Фильтр регулярных выражений для 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

Другие вопросы по тегам