7

我想过滤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

我想问一下是否可以为 a 定义像这样的过滤器QFileDialog

4

3 回答 3

11

我相信你能做的是:

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

对话框是这样创建的:

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

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

于 2011-02-04T02:14:37.287 回答
2

@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_gubenkos 答案现在就可以了)。本机对话框不支持 custom ProxyModel

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

我花了很长时间才发现这一点。这是写在这里

于 2017-11-28T09:34:16.473 回答
-1

好的,我已经将它与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 文件。

于 2014-10-13T23:45:09.547 回答