[英]Filtering in 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
定义这样的过滤器?
我相信你能做的是:
下面是一个例子:
代理模式:
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();
仅非本机文件对话框支持代理模型。
@serge_gubenko 的解决方案运行良好。 通过继承QSortFilterProxyModel
创建您自己的ProxyModel
。
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 答案现在这样做)。 本机对话框不支持自定义ProxyModel
。
QFileDialog dialog;
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.exec();
我花了很长时间才发现这一点。 这是写在这里
好的,我已经将它与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 文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.