Regular Expression Filter for QFileDialog

前提是你 提交于 2020-01-11 13:21:49

问题


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


来源:https://stackoverflow.com/questions/41995834/regular-expression-filter-for-qfiledialog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!