gpt4 book ai didi

qt - 在QFileDialog中过滤

转载 作者:行者123 更新时间:2023-12-04 13:12:15 24 4
gpt4 key购买 nike

我想过滤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方法,并为具有“.backup”的文件返回false。他们的名字中的单词;
  • 在文件对话框中设置新的代理模型: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();
    代理模型仅受非 native 文件对话框支持。

    关于qt - 在QFileDialog中过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893122/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com