GtkTreeviewColumn,每行有不同的组合模型

时间:2010-08-26 13:38:38

标签: python combobox gtk gtktreeview

我有一套全球价值观,例如: ["Foo", "Bar", "Baz", "Quux"]。我TreeView中的每一行代表一个只能处理这些值的子集的实体。例如,第一行可能会处理"Foo""Bar",第二行可能会处理"Bar""Quux"。我想要一个ComboBox列,允许每一行选择一个可以处理的值。

但是,从我现在的代码中,整个列只能有ComboBox的一个模型:

crc = gtk.CellRendererCombo()
crc.set_property('model', fooValuesModel)
crc.set_property('text-column', 0)
crc.set_property('editable', True)
crc.set_property('has_entry', False)

cl = gtk.TreeViewColumn(ctitle, crc, text=i)
treeView.append_column(cl)

我只有一次机会为整个专栏设置模型。有没有办法为每一行设置不同的商店,或以某种方式过滤价值?

2 个答案:

答案 0 :(得分:3)

您要找的是gtk.TreeModelFilter。它是一个树模型,包含另一个基础树模型的过滤值。您可以通过调用过滤模型上的set_visible_func()来确定哪些行应该可见。

答案 1 :(得分:2)

还有另一种方法可以做到这一点。

另见: http://mail.gnome.org/archives/gtk-perl-list/2005-July/msg00065.html

(它在perl中,但转换为python不应该太难)

这个秘密是:

假设您使用TreeStore作为其模型的TreeView。其中一列使用组合框单元格渲染器,每行将获得一个ListStore模型:

  1. 您可以将ListStores放入TreeStore列中,perl将是Gtk2::ListStore类型的列。当然,您不会直接向TreeView添加列。代替:

  2. 使用“insert_column_with_attributes”并将“model”属性连接到TreeStore的ListStore列时,可以让comboboxcell-column使用Treeview中的列作为ListStore。 / p>

  3. 向树视图添加行时,只需将完整的ListStore放入TreeStore的ListStore列即可。然后,您可以使用您想要的任何值填充每行ListStore。