gtk.treeviewcolumn 未排序

1 投票
2 回答
1170 浏览
提问于 2025-04-16 05:27

我已经实现了一个可以排序的树形视图。点击列标题可以让它按升序排列,再点击一次则变为降序排列。不过,如果我第三次点击列标题,它就会变成一种“未排序”的状态,而不是回到升序。我把一个函数连接到了列的clicked信号上,并打印出了列的get_sort_order(),每次点击我得到的结果是:第一次点击返回SORT_ASCENDING(升序),第二次点击返回SORT_DESCENDING(降序),第三次点击又返回SORT_DESCENDING(未排序状态)。我的树形视图的构建大致是这样的:

    self.hsModel = gtk.TreeStore(*[c[0] for c in columns])
    self.hsModelFilter = self.hsModel.filter_new()
    self.hsModelSort = gtk.TreeModelSort(self.hsModelFilter)
    #... define filterfunc ...
    self.hsModelFilter.set_visible_func(filterfunc)
    self.hsSelect = gtk.TreeView(self.hsModelSort)

    cl = gtk.TreeViewColumn(ctitle, renderer, **attrcols)                    
    cl.set_clickable(True)
    cl.set_sort_column_id(COL_ACTUALTIME)

    #... define sortdate ...
    self.hsModelSort.set_sort_func(COL_ACTUALTIME, sortdate)
    self.hsModelSort.set_sort_column_id(COL_ACTUALTIME, gtk.SORT_DESCENDING)

绝对不想进入这个“未排序”的状态。我希望它始终保持升序或降序排列。请问我该如何去掉这个“未排序”的状态呢?

2 个回答

0

我没有测试过,但你可以试试下面的代码:

self.hsModelSort.set_default_sort_func (None)

这个默认值是“使用底层顺序”,但应该可以重置为“完全不排序”的状态。

1

使用 self.hsModelSort.set_default_sort_func(None) 这个方法是可以的,但这样会丢失之前的排序状态。如果你就是想这样,那就没问题。但如果你想保留原来的排序状态,就需要把默认排序函数设置成一个能把列排序回原来状态的函数。

很可能你一开始就已经把值按降序排序了,所以你只需要这样做:

self.hsModelSort.set_sort_column_id(COL_ACTUALTIME, gtk.SORT_ASCENDING) self.hsModelSort.set_default_sort_func(None)

希望这样能让我的意思更清楚:

import gtk

w = gtk.Window()
w.resize(300, 300)

cols = [(1,8,3),
        (7,12,9),
        (4,5,6),
        (10,11,12)]

model = gtk.ListStore(int, int, int)
model.set_sort_column_id(0, gtk.SORT_ASCENDING)
model.set_default_sort_func(None )

#sort columns in ascending order for the column 0
cols.sort(lambda x,y: cmp(x[0],y[0]), reverse=True)

for c in cols:
    model.append(c)

tv = gtk.TreeView(model)
tv.set_headers_clickable(True)

columns = ('one', 'two', 'three')
renderer = gtk.CellRendererText()
for i, c in enumerate(columns):
    col = gtk.TreeViewColumn(c, renderer)
    col.add_attribute(renderer, 'text', i)
    col.set_clickable(True)
    col.set_sort_column_id(0)
    col.set_sort_indicator(True)
    tv.append_column(col)

w.add(tv)
w.show_all()
w.connect('destroy', lambda _: gtk.main_quit())
gtk.main()

撰写回答