QSortFilterProxyModel不会动态更新过滤器?

时间:2015-08-19 22:15:17

标签: c++ qt qt4 qabstractitemmodel qsortfilterproxymodel

我有QSortFilterProxyModel的自定义子类。我使用我想要的自定义过滤器覆盖了filterAcceptsRow。然后我就这样使用了它:

proxy = new MyFilterModel();
proxy->setSourceModel(...);
proxy->setDynamicSortFilter(true);
proxy->setFilterParams(...); // my custom function
comboBox->setModel(proxy);

但是,如果更新了基础源模型,以便不再过滤先前已过滤的行,则不会使用这些行更新组合框。那是为什么?

最终我在setSourceModel中覆盖了MyFilterModel,如此:

void MyFilterModel::setSourceModel(QAbstractItemModel *sourceModel)
{
    QSortFilterProxyModel::setSourceModel(sourceModel);

    connect(sourceModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(doInvalidateFilter()));
    connect(sourceModel, SIGNAL(modelReset()), this, SLOT(doInvalidateFilter()));

    invalidateFilter();
}

...所有doInvalidateFilter()所做的就是致电invalidateFilter。这很有效 - 现在模型更新时,过滤器行本身也会更新。

我认为setDynamicSortFilter应该已经处理过这个问题了。这是Qt中的错误吗?

2 个答案:

答案 0 :(得分:0)

我遇到类似的问题,代理工作正常。 我的模型看起来像:

class MyModel:public QAbstractListModel{
...
    bool setData(...) Q_DECL_OVERRIDE;
    MyItem* get(int index);
private:
    QList<MyItem*> m_model;
}

我以为我是通过模型改变MyItem(在QML中)(间接通过调用“setData(...)”),但在我碰到你的帖子之后我再次检查了QML文件我发现我不是改变模型而是改变项目本身。

模型并不知道代理和视图的变化。

我更新了MyItem,以便在父模型发生变化时向其发出信号,因此模型可以发出DataChanged(...)并通知其他人。

您的代码中可能有类似内容吗?

答案 1 :(得分:0)

也许这部分文档对您有用:

"注意,当 dynamicSortFilter 为 true 时,您不应通过代理模型更新源模型。例如,如果您在 QComboBox 上设置代理模型,那么使用更新模型的函数,例如 addItem(),将无法按预期工作。另一种方法是将 dynamicSortFilter 设置为 false 并在将项目添加到 QComboBox 后调用 sort()。"