1

我正在为稍后更复杂的项目编写一个使用 QTreeModel 和 QTreeView 的简单测试程序。在这个简单的程序中,我有分组数据,可以收缩或扩展,正如人们在 QTreeView 中所期望的那样。数据也可以按各种数据列排序(QTreeView.setSortingEnabled 为 True)。每个树项都是一个数据列表,所以TreeModel类中实现的排序函数使用了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 的问题,但我不确定。

4

2 回答 2

2

要回答您的问题“我做错了什么”——您在发出 layoutChanged() 之前没有更新持久模型索引。模型的客户端不会神奇地知道模型的数据是如何移动的;例如,他们不知道索引 (2,0,root) 移动到了 (12,0,root)。

您传达更改的方式是发出布局信号;你的那部分是正确的。Qt 很可能通过将它保留的任何 QModelIndexes 转换为 QPersistentModelIndex 来响应 layoutAboutToBeChanged()。当它得到 layoutChanged() 时,它会将它们转换回来。在这两者之间,您应该查看 QPersistentModelIndex 列表并使用新位置更新索引。检查 layoutChanged() 信号的文档。

于 2010-12-11T10:41:34.660 回答
1

我通过为排序实现 QSortFilterProxyModel 解决了这个问题。

于 2010-04-17T05:05:41.797 回答