QSortFilterProxyModel没有中继dataChanged信号

时间:2013-12-04 09:05:12

标签: c++ qt model-view-controller qsortfilterproxymodel

我有一个自定义模型,它会在某些单元格的值发生变化时不时发出dataChanged()信号。 这本身很好用,视图会根据需要更新。

但后来我尝试在中间插入一个QSortFilterProxyModel以允许在我的视图上进行排序(不需要过滤),显然dataChanged()信号不会通过代理模型进行中继。

据我所知,这是QSortFilterProxyModel的预期行为,除了子类化QSortFilterProxyModel之外是否有任何解决方案,只是添加一个插槽来中继dataChanged()信号并相应地映射项目?

在我的情况下,它非常直接,因为一次只更新一个单元格,或整个列,但没有别的时髦,所以映射索引应该非常简单......

2 个答案:

答案 0 :(得分:3)

QSortFilterProxyModel应该像普通模型一样发出 dataChanged()信号,因此视图会更新。我们可以在Qt的源代码(qsortfilterproxymodel.cpp)中看到QSortFilterProxyModel :: setSourceModel将处理程序附加到源模型的 dataChanged()信号。如果一切顺利,处理程序将完成其工作并发出QSortFilterProxyModel的 dataChanged()信号。请注意,它有许多可以阻止信号发射的检查。

如果没有发生,请确保正确实现自定义模型,否则QSortFilterProxyModel逻辑可以抑制信号。例如,当我遇到同样的问题时,我发现我的 QAbstractItemModel :: parent 方法的实现是错误的。

在最糟糕的情况下,您可以尝试自己编译Qt并进行一些调试以找到原因。

答案 1 :(得分:0)

您可以从QSortFilterProxyModel调用信号而不继承它 QMetoObject::invokeMethod 别忘了检查帮手功能: mapFromSource mapToSource