在QFileDialog中过滤

时间:2011-02-03 23:52:36

标签: qt filter qfiledialog

我希望过滤QFileDialog中显示的文件,而不仅仅是文件扩展名。我在Qt文档中找到的示例仅显示Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)等过滤器。除此之外,我还想为文件对话框中显示的文件指定一个过滤器,例如: XML files (*.xml)但不是Backup XML files (*.backup.xml)

所以我遇到的问题是我想在文件对话框中显示一些具有特定文件扩展名的文件,但我不想显示具有特定文件名后缀的其他文件(以及相同的文件扩展名)。

例如:

要显示的文件:

file1.xml  
file2.xml

不显示的文件:

file1.backup.xml  
file2.backup.xml

我想问一下是否可以为QFileDialog

定义类似的过滤器

3 个答案:

答案 0 :(得分:9)

我相信你能做的是:

  1. 创建自定义代理模型。您可以使用QSortFilterProxyModel作为模型的基类;
  2. 在代理模型中覆盖filterAcceptsRow方法,并为名称中包含“。backup。”字样的文件返回false;
  3. 将新代理模型设置为文件对话框:QFileDialog::setProxyModel;
  4. 以下是一个例子:

    代理模型:

    class FileFilterProxyModel : public QSortFilterProxyModel
    {
    protected:
        virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
    };
    
    bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
    {
        QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
        QFileSystemModel* fileModel = qobject_cast<QFileSystemModel*>(sourceModel());
        return fileModel->fileName(index0).indexOf(".backup.") < 0;
        // uncomment to call the default implementation
        //return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent);
    }
    
    以这种方式创建了

    对话框:

    QFileDialog dialog;
    dialog.setProxyModel(new FileFilterProxyModel);
    dialog.setNameFilter("XML (*.xml)");
    dialog.setOption(QFileDialog::DontUseNativeDialog);
    dialog.exec();
    

    仅非非本机文件对话框支持代理模型。

答案 1 :(得分:1)

@serge_gubenko的解决方案运作良好。通过继承ProxyModel

创建自己的QSortFilterProxyModel
class FileFilterProxyModel : public QSortFilterProxyModel
{
protected:
    virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
};

bool FileFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    // Your custom acceptance condition
    return true;
}

确保在设置代理模型之前设置DontUseNativeDialog (而不是@serge_gubenko的方式)。原生对话框不支持自定义ProxyModel

QFileDialog dialog;
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.exec();

我花了很长时间才发现这一点。这是here

答案 2 :(得分:0)

好的,我已经将它与 QFileDialog 对象一起使用了。这只显示了相应目录中列出的文件。选择要处理的文件非常好。例如,XML文件,PNG图像等。

这里我展示了我的例子

 OlFileDialog QFileDialog (this); 
 QString slFileName; 
 olFileDialog.setNameFilter (tr ("Files (* xml)")); 
 olFileDialog.setFileMode (QFileDialog :: anyfile); 
 olFileDialog.setViewMode (QFileDialog :: Detail); 
 if (olFileDialog.exec ()) 
     olFileDialog.selectFile (slFileName); 
 else 
     return; 

对话框将仅显示呈现的xml文件。