如何排序GTK树形与其子从父不同

问题描述:

我有一个GTK树视图显示在IE的艺术家子节点艺术家名称作为它的父节点及其关联相册可以有很多的专辑如何排序GTK树形与其子从父不同

的树视图中的艺术家名称 - treestore模型连接到TreeView列,以便用户可以单击列标题按照升序或降序排列艺术家名称。

但是,我还需要孩子专辑名称的固定名称顺序,例如升序或降序

例如 - 在固定升序然后相册当列标题升序:

MJ - 
    - Album1MJ 
    - Album2MJ 
PQ - 
    - Album1PQ 
    - Album2PQ 
ZY - 
    - Album1ZY 

当列标题降序:

ZY - 
    - Album1ZY 
PQ - 
    - Album1PQ 
    - Album2PQ 
MJ - 
    - Album1MJ 
    - Album2MJ 

因此,使用GtkTreeModelSort在我的树视图上,我已经定义了0列上的set_sort_func,它是Artist Name列

set_sort_func是defi ned as:

def _compare(self, model, row1, row2, user_data): 
    sort_column = 0 

    value1 = model.get_value(row1, sort_column) 
    value2 = model.get_value(row2, sort_column) 
    if value1 < value2: 
     return -1 
    elif value1 == value2: 
     return 0 
    else: 
     return 1 

这样排列艺术家名称。

我的问题是,我应该如何应用子排序来确保专辑名称具体是以升序还是降序排列?

我使用Gtk3和上面的例子是python2.7


这是我使用的Python代码:

from gi.repository import Gtk 

def _compare(model, row1, row2, user_data): 
    sort_column = 0 

    value1 = model.get_value(row1, sort_column) 
    value2 = model.get_value(row2, sort_column) 
    if value1 < value2: 
     return -1 
    elif value1 == value2: 
     return 0 
    else: 
     return 1 

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

model = Gtk.TreeStore(str) 
model.set_sort_column_id(0, Gtk.SortType.ASCENDING) 

artist_iter=model.append(None, ['PQ']) 
model.append(artist_iter, ['Album1PQ']) 
model.append(artist_iter, ['Album2PQ']) 
artist_iter=model.append(None, ['MJ']) 
model.append(artist_iter, ['ALBUM1MJ']) 
model.append(artist_iter, ['ALBUM2MJ']) 
artist_iter=model.append(None, ['ZY']) 
model.append(artist_iter, ['ALBUM1ZY']) 

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

c=0 
i=0 
renderer = Gtk.CellRendererText() 
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) 

tree_sort = Gtk.TreeModelSort(model=model)    
tree_sort.set_sort_func(0, _compare, None) 

tree_sort.set_sort_column_id(0, Gtk.SortType.ASCENDING) 
tv.set_model(tree_sort) 
tv.expand_all() 

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

,如果你与你的创造TreeViewColumn:

Gtk.TreeViewColumn.set_sort_column_id(0) 

它应该自动分类父母和孩子。试着让我知道。如果没有,请在这里放入你的python代码。

好吧,我明白你想要什么。试试这个:

from gi.repository import Gtk 

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

model = Gtk.TreeStore(str, str) 

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

renderer = Gtk.CellRendererText() 
col_artist = Gtk.TreeViewColumn(0, renderer) 
col_artist.add_attribute(renderer, 'text', 0) 
col_artist.set_clickable(True) 
col_artist.set_sort_indicator(True) 
tv.append_column(col_artist) 


renderer = Gtk.CellRendererText() 
col_album = Gtk.TreeViewColumn(1, renderer) 
col_album.add_attribute(renderer, 'text', 1) 
col_album.set_clickable(False) 
tv.append_column(col_album) 

artist_iter=model.append(None, ['PQ', '']) 
model.append(artist_iter, ['', 'Album1PQ']) 
model.append(artist_iter, ['', 'Album2PQ']) 
artist_iter=model.append(None, ['MJ', '']) 
model.append(artist_iter, ['', 'ALBUM1MJ']) 
model.append(artist_iter, ['', 'ALBUM2MJ']) 
artist_iter=model.append(None, ['ZY', '']) 
model.append(artist_iter, ['', 'ALBUM1ZY']) 

col_artist.set_sort_column_id(0) 
tv.expand_all() 

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

我为专辑添加了一列,我将它设置为不可点击并且无法排序。 我将订单设置为col_artist。 我认为是唯一的方式,但我不确定。 让我知道。 再见

+0

修改我的答案。 – maurelio79

+0

嗨 - 这绝对是一个解决方案(+1),虽然它与单独的列看起来很奇怪。例如,您不能使用GtkGridlines将艺术家与相册进行可视化链接。如果使用Gtk.TreeModelSort包装模型,并在排序的模型上使用set_sort_column_id(1),则可以对第二列进行排序。如果可能的话,我宁愿使用从视觉角度来看的一列。 – fossfreedom

+0

我同意你的意见。我还阅读了一些文档,但没有发现nothig。 :-(我们确信它是可能的吗?无论如何,你给了我另一个python练习的想法!无论如何,如果你想添加专辑年份,歌曲持续时间,ecc – maurelio79