我有一套全球价值观,例如: ["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)
我只有一次机会为整个专栏设置模型。有没有办法为每一行设置不同的商店,或以某种方式过滤价值?
答案 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模型:
您可以将ListStores放入TreeStore列中,perl将是Gtk2::ListStore
类型的列。当然,您不会直接向TreeView添加列。代替:
使用“insert_column_with_attributes”并将“model”属性连接到TreeStore的ListStore列时,可以让comboboxcell-column使用Treeview中的列作为ListStore。 / p>
向树视图添加行时,只需将完整的ListStore放入TreeStore的ListStore列即可。然后,您可以使用您想要的任何值填充每行ListStore。