0

我想显示一个过滤特定模式的文件打开对话框,*.000例如*.999.

QFileDialog::getOpenFileNames允许您指定离散过滤器,例如*.000,*.001等。我想设置一个正则表达式作为过滤器,在这种情况下^.*\.\d\d\d$,即任何具有三位数扩展名的文件名。

4

2 回答 2

1

可以通过将代理模型添加到 QFileDialog 来完成。这里解释了:Filtering in QFileDialog

于 2017-02-02T07:56:43.123 回答
1

ariwez 为我指明了正确的方向。主要要注意的是打电话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();
于 2017-02-07T06:41:02.793 回答