我希望过滤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
?
答案 0 :(得分:9)
我相信你能做的是:
以下是一个例子:
代理模型:
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文件。