【问题标题】:Regular Expression Filter for QFileDialogQFileDialog 的正则表达式过滤器
【发布时间】:2017-06-19 03:32:41
【问题描述】:

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

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

【问题讨论】:

    标签: qt fileopendialog qregularexpression


    【解决方案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();
    

    【讨论】:

      【解决方案2】:

      可以通过在 QFileDialog 中添加代理模型来完成。这里解释一下:Filtering in QFileDialog

      【讨论】:

      • 根据 Qt 文档,这应该可以工作。我已经按照上面链接中的说明进行操作,但是,子类的filterAcceptsRow 永远不会被调用。
      • 我应该补充一点,我使用的是 Qt 5.4.1、Win 10 和 VS 2013。
      • 好吧,Qt5 和 VS dialog.setProxyModel(&filter) 不工作 - 并且 dialog.proxyModel() 保持为空,所以没有进行过滤。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2012-12-10
      • 2018-01-11
      • 1970-01-01
      相关资源
      最近更新 更多