gpt4 book ai didi

c++ - QSortFilterProxyModel 不会动态更新过滤器?

转载 作者:太空狗 更新时间:2023-10-29 23:14:47 26 4
gpt4 key购买 nike

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

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

但是,当基础源模型更新时,以前被过滤的行不应再被过滤,组合框不会用这些行更新。这是为什么?

最终,我在 MyFilterModel 中覆盖了 setSourceModel,如下所示:

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中的错误吗?

最佳答案

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

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

我以为我正在通过一个模型(通过调用“setData(...)”间接地)更改 MyItem(在 QML 中),但是在我碰到你的帖子之后我又检查了一次 QML 文件并且碰巧我不是在更改模型,而是在更改项目本身。

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

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

您的代码中可能有类似的东西吗?

关于c++ - QSortFilterProxyModel 不会动态更新过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32106531/

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