我有一个自定义模型,当某些单元格的值发生更改时,它会不时地附加以发出 dataChanged() 信号。
这本身就很好用,并且 View 会根据需要更新。
但是后来我尝试在中间插入一个 QSortFilterProxyModel 以允许在我的 View 上进行排序(不需要过滤),显然 dataChanged() 信号没有通过代理模型中继。
据我所知,这是 QSortFilterProxyModel 的预期行为,除了子类化 QSortFilterProxyModel 之外,还有其他解决方案吗,只是添加一个插槽来中继 dataChanged() 信号并相应地映射项目?
在我的情况下,它非常简单,因为一次只更新一个单元格或一整列,但没有其他时髦的东西,所以映射索引应该非常简单......
最佳答案
QSortFilterProxyModel 应该像普通模型一样发出 dataChanged() 信号,因此 View 将得到更新。我们可以在 Qt 的源代码(qsortfilterproxymodel.cpp)中看到 QSortFilterProxyModel::setSourceModel 为源模型的 dataChanged() 信号附加了一个处理程序。如果一切顺利,处理程序会执行其工作并发出 QSortFilterProxyModel 的 dataChanged() 信号。请注意,它有许多检查可以防止发出信号。
如果没有发生这种情况,请确保您的自定义模型正确实现,否则 QSortFilterProxyModel 逻辑可能会抑制信号。例如,当我遇到同样的问题时,结果证明我的 QAbstractItemModel::parent 方法的实现是错误的。
在最坏的情况下,您可以尝试自己编译 Qt 并进行一些调试以找到我们的原因。
关于c++ - QSortFilterProxyModel 没有中继 dataChanged 信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20371047/