其他分享
首页 > 其他分享> > 子树移动后如何更新TreeModel

子树移动后如何更新TreeModel

作者:互联网

我有一个自定义的GenericTreeModel,效果很好.现在,我希望用户能够使用拖放来重新排列节点,因此我将节点移动到数据模型中的新父节点.
但是,然后,希望使用诸如row_has_child_toggled,row_deleted和row_inserted之类的方法来通知TreeModel.

因此,显然没有row_moved,并且调用row_deleted(对于原始路径)和row_inserted(对于新路径)似乎还不够.所以我认为我可能必须递归地发布这些更改.

考虑以下示例:

* A (0,)
* B (1,)
  * C (1,0)
    * D (1,0,0)

现在,如果我将C移到A,则会发生以下情况:

row_delete( (1,0) ) # C
row_delete( (1,0,0) ) # D
row_inserted( (0,0) ) # C'
row_inserted( (0,0,0) ) # D'
child_toggle( (0,) ) # A
child_toggle( (1,) ) # B
child_toggle( (0,1) ) # C'

但是,gtk仍然抱怨模型状态不一致.我想到两件事:

>也许调用这些函数的顺序是相关的(如果有的话,怎么想的?)
>从技术上讲,还会发生child_toggle((1,0)),但是该行已被a)删除,并且b)row_has_child_toggled需要tree_iter引用,由于它已不存在,因此我无法获得该引用.

也许我在这里采用了完全错误的方法,那么解决此问题的最佳方法是什么?

解决方法:

弄清楚了:删除子树可以通过删除子树的根节点行来正常工作(通知模型路径已消失,并有条件地切换parent.has_child).插入新的子树也是如此,因此我不需要递归地告诉模型内容.

但是,组合至关重要,因此

>首先删除,通知模型
>然后插入并再次通知模型.

标签:gtktreeview,pygtk,python
来源: https://codeday.me/bug/20191208/2087897.html