gtk.treeviewcolumn 未排序
我已经实现了一个可以排序的树形视图。点击列标题可以让它按升序排列,再点击一次则变为降序排列。不过,如果我第三次点击列标题,它就会变成一种“未排序”的状态,而不是回到升序。我把一个函数连接到了列的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()