Search code examples
qtfileopendialogqregularexpression

Regular Expression Filter for QFileDialog


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.


Solution

  • 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();