我正在编写一个简单的测试程序,使用QTreeModel和QTreeView来处理更复杂的项目。在这个简单的程序中,我有一组可以签约或扩展的数据,正如人们在QTreeView中所期望的那样。数据也可以按各种数据列排序(QTreeView.setSortingEnabled为True)。每个树项都是一个数据列表,因此TreeModel类中实现的sort函数使用内置的python列表排序:
self.layoutAboutToBeChanged.emit()
self.rootItem.childItems.sort(key=lambda x: x.itemData[col], reverse=order)
for item in self.rootItem.childItems:
item.childItems.sort(key=lambda x: x.itemData[col], reverse=order)
self.layoutChanged.emit()
问题在于,每当我更改根的子项的排序(树只有2级深度,因此这是唯一的子级别)时,节点不一定像以前那样扩展。如果我在不扩展或折叠任何内容的情况下更改排序,则会在排序更改之前扩展节点 谁能向我解释我做错了什么?我怀疑它没有正确地将QModelIndex与已排序的节点重新分配,但我不确定。
答案 0 :(得分:2)
回答你的问题“我做错了什么” - 你在发布layoutChanged()之前没有更新持久模型索引。模型的客户端并不神奇地知道模型数据的移动方式;例如,他们不知道索引(2,0,root)变为(12,0,root)。
传达变化的方式是发出布局信号;你有那个部分是正确的。 Qt很可能通过将它保存的任何QModelIndex转换为QPersistentModelIndex来响应layoutAboutToBeChanged()。当它获得layoutChanged()时,它会将它们转换回来。在中间,您应该查看该QPersistentModelIndex列表并使用新位置更新索引。检查docs以获取layoutChanged()信号。
答案 1 :(得分:1)
我通过为排序实现QSortFilterProxyModel解决了这个问题。