2

我有一组全局值,例如["Foo", "Bar", "Baz", "Quux"]. my 中的每一行TreeView代表一个只能处理这些值的子集的实体。例如,第一行可能处理"Foo"and "Bar",第二行可能处理"Bar"and "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)

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

4

2 回答 2

3

您正在寻找的是gtk.TreeModelFilter. 它是一个树模型,包含另一个底层树模型的过滤值。set_visible_func()您可以通过调用过滤后的模型来决定哪些行应该可见。

于 2010-08-26T14:55:46.477 回答
2

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

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

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

秘密是这样的:

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

  1. 您可以将 ListStores 放入 TreeStore 列中,在 perl 中,这将是 type 的列Gtk2::ListStore。当然,您不会向直接显示此内容的 TreeView 添加列。反而:

  2. 当您将它添加到树视图时,您可以让组合框单元列使用 Treeview 中的该列作为其 ListStore,使用“insert_column_with_attributes”并将“模型”属性连接到 TreeStore 的 ListStore 列。

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

于 2011-05-03T13:39:29.620 回答