在TreeView重新排序后从.get_model()和.get_path()获取原始行号

3 投票
1 回答
1494 浏览
提问于 2025-04-16 04:19

我有一个树形视图(TreeView)和树形存储(TreeStore),我用一个列表里的数据来填充它。我的应用程序只用这个列表作为参考数据。树形存储只是为了显示而构建的。而树形视图可以通过点击列标题来重新排序,因为在初始化每一列时用了.set_sort_column_id()

问题是,下面的代码总是返回在显示中被点击的行号:

# convert ListStore iter to row number
def rowno(self):
     (model, iter) = self.MY_LIST_STORE.get_selection().get_selected()
     return model.get_path(iter)[0]

这本来就是应该这样做的。只要原始的未排序列表显示出来,这个功能对我来说是没问题的。但是一旦树形视图(和树形存储?)被重新排序后,显示的行号(.get_path)就不再和我原始数据存储中的行号对应了。

我该怎么把它们对应起来呢?或者我怎么才能找到哪个选中的路径号对应于我最开始传入树形视图列表中的哪个条目呢?

(当然,我可以在树形存储中插入一个假列来保留我原来的行号。但应该有某种原生的方法来实现这个吧?)

1 个回答

1

恭喜你,你已经进入了PyGTK中最棘手的部分。我不指望能因此得到什么奖励,但我的解决方案是把你的模型包裹在一个可排序的模型和一个可过滤的模型中。这样一来,你就可以根据需要获取不同的路径和迭代器,适应这三个嵌套模型的需求。这里的代码太复杂,不适合直接展示,但我们在PyGTKHelpers中进行了简化,你可以轻松使用或者复制到自己的项目中。这是相关模块的链接。

撰写回答