Regular Expression Filter for QFileDialog

2019-03-04 13:57发布

问题:

I would like to display a file open dialog that filters on a particular pattern, for example *.000 to *.999.

QFileDialog::getOpenFileNames allows you to specify discrete filters, such as *.000, *.001, etc. I would like to set a regular expression as a filter, in this case ^.*\.\d\d\d$, i.e. any file name that has a three digit extension.

回答1:

It can be done by adding proxy model to QFileDialog. It is explained here: Filtering in QFileDialog



回答2:

ariwez pointed me into the right direction. The main thing to watch out for is to call dialog.setOption(QFileDialog::DontUseNativeDialog) before dialog.setProxyModel.

The proxy model is:

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);
    }
};

The file dialog is created as follows:

QFileDialog dialog;

// Call setOption before setProxyModel.
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.setProxyModel(new FileFilterProxyModel);
dialog.exec();