题
我想过滤显示在 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
?
解决方案
我相信您可以做的是:
- 创建自定义代理模型。您可以将 QSortFilterProxyModel 用作模型的基类;
- 在代理模型中,覆盖 filterAcceptsRow 方法并返回false名称中带有“。backup。” 字的文件;
- 在文件对话框中设置新的代理模型: QFileDialog :: setProxyModel ;
下面是一个示例:
代理模型: 通用标签
对话框是通过以下方式创建的: 通用标签
仅非本地文件对话框支持代理模型。
其他提示
@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
s。
QFileDialog dialog;
dialog.setOption(QFileDialog::DontUseNativeDialog);
dialog.setProxyModel(new FileFilterProxyModel);
dialog.setNameFilter("XML (*.xml)");
dialog.exec();
我花了相当长的时间才发现这一点。这是写的 这里
好的,我已经将它与 QFileDialog 对象一起使用了。而这仅显示了相应目录中列出的文件。只选择要处理的文件是非常好的。例如,XML文件,PNG图像等。
在这里我展示我的例子 通用标签
该对话框将仅显示当前的xml文件。
不隶属于 StackOverflow