QSortFilterProxyModel没有中继dataChanged信号

QSortFilterProxyModel no relaying the dataChanged signal

本文关键字:dataChanged 信号 QSortFilterProxyModel      更新时间:2023-10-16

我有一个自定义模型,当一些单元格的值发生变化时,它会不时地附加以发出dataChanged()信号。这本身就非常有效,并且视图会根据需要进行更新。

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

据我所知,这是QSortFilterProxyModel的预期行为,除了将QSortFilterProxy Model子类化之外,还有什么解决方案可以添加一个插槽来中继dataChanged()信号并相应地映射项吗?

在我的情况下,这是非常直接的,因为一次只更新一个单元格,或者更新一整列,但没有其他奇怪的地方,所以映射索引应该非常简单。。。

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

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

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

您可以通过以下方式从QSortFilterProxyModel调用信号,而无需继承QMetoObject::invokeMethod不要忘记检查助手功能:mapFromSourcemapToSource