QSortFilterProxyModel 不动态更新过滤器?

Cla*_*diu 6 c++ qt qt4 qabstractitemmodel qsortfilterproxymodel

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

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

但是,当基础源模型更新以使之前筛选的行不再被筛选时,组合框不会使用这些行进行更新。这是为什么?

最终我像这样重写setSourceModelMyFilterModel

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();
}
Run Code Online (Sandbox Code Playgroud)

... 所做的一切doInvalidateFilter()就是调用invalidateFilter。这很有效——现在当模型更新时,过滤器行本身也会更新。

不过,我认为setDynamicSortFilter应该已经解决了这个问题。这是 Qt 中的错误吗?

小智 0

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

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

我以为我正在通过模型更改 MyItem(在 QML 中)(通过调用“setData(...)”间接地),但是在我碰到你的帖子后,我再次检查了 QML 文件,结果发生了我改变的不是模型而是物品本身。

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

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

也许你的代码中有类似的东西?