首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新sourceModel()而不对QSortFilterProxyModel应用过滤

更新sourceModel()而不对QSortFilterProxyModel应用过滤
EN

Stack Overflow用户
提问于 2020-04-09 14:08:39
回答 2查看 815关注 0票数 2

我有一个自定义模型(QAbstractListModel)和一个自定义代理模型(QSortFilterProxyModel)充当过滤器。在视图中,当我更新模型时,我需要执行"emit dataChanged(...)“来查看这些更改的显示。

但是,代理模型会自动更新(调用filterAcceptsRow),视图将应用相应的筛选选项。

我需要禁用此行为,以便能够更新视图,并且只在单击按钮时应用筛选,而不是自动。

例如:

selected (bool)

  • In My Model有两个字段,即id (int)和视图,我只筛选那些被选中的元素(选中的== true)
  • ,并应用此筛选器,我取消选择一个元素。

对于当前行为,此元素将消失,因为在模型更改时应用了筛选器。我想用此更改显示项目,并仅在单击按钮时应用筛选。

EN

回答 2

Stack Overflow用户

发布于 2020-04-09 20:35:33

您可以在自定义代理模型中实现公共方法,该方法用于启用/禁用筛选器。在我的示例代码中,我使用Q_INVOKABLE宏使enableFilter()也可以从QML调用。因此,通过调用方法,可以在单击按钮时启用筛选器。

代码语言:javascript
运行
复制
class ExampleFilterProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
public:
    explicit ExampleFilterProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {}

    Q_INVOKABLE void setFilter(const QString & pattern) {
        QRegularExpression re(pattern, QRegularExpression::CaseInsensitiveOption);
        if (re.isValid()) {
            QSortFilterProxyModel::setFilterRegularExpression(pattern);
        }
        invalidateFilter();
    }

    Q_INVOKABLE void enableFilter(bool enabled) {
        m_enabled = enabled;
        invalidateFilter();
    }

protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override {
    if (m_enabled) {
        QModelIndex index = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent);
        QString str = sourceModel()->data(index, filterRole()).toString();
        return str.contains(filterRegularExpression());
    }
    return true;
}

private:
    bool m_enabled = false;
};

当您实例化模型时,如果没有显式地使用true调用enableFilter,则filterAcceptsRow()方法将返回所有行的true。

代码语言:javascript
运行
复制
myFilterProxyModel->setFilterRole(MyListModel::ExampleRole);
myFilterProxyModel->setFilter("^fullstringmatch$");
myFilterProxyModel->setSourceModel(myModel);
//myFilterProxyModel->enableFilter(true);

如果您正在使用QML,那么您将使自定义代理模型对QML上下文可见,例如将其设置为上下文属性(例如filterProxyModel),并通过调用启用筛选器。

代码语言:javascript
运行
复制
filterProxyModel.enableFilter(true)
票数 1
EN

Stack Overflow用户

发布于 2020-04-10 17:05:37

设置动态排序筛选器对我有效。默认情况下,在较早版本的QT中,这是错误的,但我意识到,对于当前版本,它是正确的!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61123100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档