我有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中的错误吗?
答案 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()。"