【问题标题】:QSortFilterProxyModel no relaying the dataChanged signalQSortFilterProxyModel 没有中继 dataChanged 信号
【发布时间】:2013-12-04 09:05:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你试过setDynamicSortFilter(true)吗?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以从 QSortFilterProxyModel 调用信号,而无需通过以下方式继承它 QMetoObject::invokeMethod 不要忘记检查辅助函数: mapFromSource mapToSource

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多