是否正确跟踪源模型行移动是QSortFilterProxyModel合同的一部分?

时间:2012-08-26 14:10:35

标签: qt model qt4 model-view

假设我有一个源模型,其中行移动用

进行修饰
beginMoveRows()
endMoveRows()

(因此发出layoutChanged())。

然后,设置QSortFilterProxyModel实例来过滤源模型的行。 当我从源头获取它时,源模型布局的变化会导致代理模型的相应重新调整(因为它会监听layoutChanged()信号并正确调整自身)。

但是文档只说:

  

注意:默认情况下,只要原始模型发生更改,模型就不会动态地重新排序和重新过滤数据。可以通过设置dynamicSortFilter属性来更改此行为。

     

dynamicSortFilter:bool   此属性用于确定在源模型的内容发生更改时是否动态排序和过滤代理模型。

我的问题:

  • (1)这样做"每当原始模型改变时#34; include"当行在原始模型中移动时#34;
  • (2)如果是这样,代理模型中的项目顺序保证与源模型中的相同,并且
  • (3)有没有人在开发过程中依赖上述行为?
  • (4) [额外问题] 如果我尝试跟踪源模型的行(AboutToBe),我会在QSortFilterProxyModel子类中移动信号并在那里调用beginMoveRows / endMoveRows(使用适当映射的行索引),这会弄乱代理,因为beginMoveRows / endMoveRows调用将尝试调整已经由QSortFilterProxyModel调整的持久索引,当处理onLayoutChanged源模型的信号时?

感谢。

1 个答案:

答案 0 :(得分:2)

您在评论中提到的问题似乎只在您使用数字或列的排序时才会显示,因此我认为您的模型不受影响。

没有提供关于要发生什么的详细规范,因此唯一的选择是查找源并希望它在将来的版本中不会发生变化。看了一下这些消息来源后,我认为你的问题的答案是:

  • (1)是的,qt正在响应layoutChanged()layoutAboutToBeChanged()信号,更新它的索引并发出自己的layoutChanged()layoutAboutToBeChanged(),因此它会对行移动作出反应。
  • (2)如果您不使用排序,只需过滤即可。在这种情况下,Qt会擦除整个内部映射并从头开始重新构建,因此数据将与源模型中的数据一样。当然,排序会分散新数据。请注意,如果您在同一父级中使用排序和移动行,则排序的模型不应显示任何更改。
  • (3)不,我只是阅读qt源码和口译。您可以自由忽略所提供的任何信息;)
  • (4)是的,layoutChanged()已经在更新持久性索引,因此再次更新它只会搞乱事情。