在QFileDialog中过滤

Bit*_*ler 5 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
Run Code Online (Sandbox Code Playgroud)

文件不显示:

file1.backup.xml  
file2.backup.xml
Run Code Online (Sandbox Code Playgroud)

我想问一下是否有可能为这样的过滤器定义QFileDialog

ser*_*nko 10

我相信你能做的是:

  1. 创建自定义代理模型.您可以使用QSortFilterProxyModel作为模型的基类;
  2. 在代理模型中覆盖filterAcceptsRow方法,并为具有".backup"的文件返回false .他们名字中的字;
  3. 将新代理模型设置到文件对话框:QFileDialog :: setProxyModel ;

以下是一个例子:

代理模型:

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);
}
Run Code Online (Sandbox Code Playgroud)

对话框是这样创建的:

QFileDialog dialog;
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.exec();
Run Code Online (Sandbox Code Playgroud)

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