2

我知道我的问题已经在这里被问过:

如何以编程方式对 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) 会很棒,但在我的情况下它并没有排序!

4

2 回答 2

10

如果不查看更多代码,很难看出出了什么问题,但我敢打赌,与另一个问题中发生的事情完全相同:您需要将树模型包装在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在这种情况下,这是模型列的索引,而不是可见的树视图列。

于 2013-09-28T05:32:03.890 回答
0

如果您对简单的字典排序没问题,并且如果您特别懒惰,并且想象您正在使用 glade 开发您的界面,也许您可​​以使用我自己的代码中的以下片段(对不起,我仍然坚持使用 gtk2) .

此答案中的代码看起来与 ptomato 的代码相似,但我们位于数据结构的不同部分,只是名称相同的方法。我只是使用 plainTreeView和 plain ListStore

gtk.TreeViewColumn小部件有一种set_sort_column_id方便的方法,可以设置几乎所有需要的东西。

这里的_tvc后缀意味着它是一个gtk.TreeViewColumn对象。如前所述,所有内容都是在给定一个 glade 文件的情况下创建的:

    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)

在这里,您有一个来自 glade 文件的片段,我在其中定义accno_tvc列,将 aCellRendererText放入其中,指定其中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_tvcgui 列上排序时要使用的数据列,重复与2glade 文件用于渲染器text属性的相同索引。

于 2018-01-12T17:17:17.117 回答