2013-09-23 78 views
1

一個專欄中,我知道我的問題已經在這裏問:排序默認情況下或一個TreeView編程

How to Programmatically Sort TreeView

但鑑於該鏈接沒有鏈接什麼,我還沒有能夠有當我的窗口顯示時,我的樹視圖被排序。

這裏是我的代碼:

treeview = Gtk.TreeView(model=liststore) 
    col = renderer_text('Nom', 1, store=liststore, sortable=True) 
    col.set_sort_order(Gtk.SortType.ASCENDING) #?????????????????????????? 
    treeview.append_column(col) 

def renderer_text(title, col, editable=False, store=None, sortable=None): 
    render = Gtk.CellRendererText() 
    if editable: 
     render.set_property('editable', True) 
     render.connect('edited', text_edited, store, col) 
    column = Gtk.TreeViewColumn(title, render, text=col) 
    if sortable: 
     column.set_sort_column_id(col) 
    return column 

的set_sort_order(Gtk.SortType.ASCENDING)將是美妙的,但它不會在沒有我的情況下進行排序!

+0

也許你做得對,但列中的對象不知道如何確定它們的排序順序。相應的類是否有'__cmp__'方法? –

+0

你有第二次打電話嗎?看起來你在排序之前排序*,這似乎是一個可疑的事情。 – Veedrac

+0

我認爲__cmp__方法沒問題。通過單擊列標題完成排序時使用它。如何做到這種不點擊?我找不到任何資源來修復我的代碼。我發現的每件事都是關於gtk2的。 –

回答

6

如果沒有看到更多的代碼,很難發現問題出在哪裏,但我會下注完全相同的事情,就像在另一個問題中一樣:您需要將樹模型包裝在Gtk.TreeModelSort中。

sorted_model = Gtk.TreeModelSort(model=liststore) 
sorted_model.set_sort_column_id(1, Gtk.SortType.ASCENDING) 
treeview = Gtk.TreeView(model=sorted_model) 

注意1是索引到模型中的列在這種情況下,不可見的樹視圖的列。

+0

非常感謝!令人難以置信的如此簡單的事情可以阻止! –

+0

upvoting因爲「索引到模型的列中,而不是可見的[東西]」。謝謝。 – mariotomo

0

如果你對簡單的詞典排序很滿意,如果你特別懶,想象你正在開發你的界面,也許你可以使用我自己的代碼中的下面的代碼片段(對不起,我還是堅持gtk2)。

在這個答案中的代碼看起來類似於ptomato's,但我們在數據結構的不同部分,它只是被命名爲相同的方法。我只是使用普通的TreeView和普通的ListStore

gtk.TreeViewColumn小部件有一個set_sort_column_id便利方法,可以設置幾乎所有需要的東西。

這裏的_tvc後綴表示它是一個gtk.TreeViewColumn對象。至於說,所有的創建給予了空地文件:

self.view.widgets.use_tvc.set_sort_column_id(0) 
    self.view.widgets.filename_tvc.set_sort_column_id(1) 
    self.view.widgets.accno_tvc.set_sort_column_id(2) 
    self.view.widgets.binomial_tvc.set_sort_column_id(3) 
    self.view.widgets.iseditable_tvc.set_sort_column_id(5) 

在這裏,你從林間空地文件,在那裏我定義accno_tvc列片段,投入它CellRendererText,在ListStore指定列它包含一些列屬性的數據。

<object class="GtkTreeViewColumn" id="accno_tvc"> 
    <property name="title" translatable="yes">acc.nr.</property> 
    <property name="clickable">True</property> 
    <child> 
    <object class="GtkCellRendererText" id="accno_crtext"> 
     <signal name="edited" handler="on_cellrenderertext_edited" swapped="no"/> 
    </object> 
    <attributes> 
     <attribute name="editable">5</attribute> 
     <attribute name="text">2</attribute> 
    </attributes> 
    </child> 
</object> 

正如你所看到的Python代碼,它指定的accno_tvc桂列排序時要使用的數據列,重複同樣的指數2的空地文件使用的渲染器的text屬性。