GtkTreeviewColumn为每行使用不同的组合模型
我有一组全局的值,比如 ["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 个回答
你要找的是 gtk.TreeModelFilter
。它是一个树形模型,里面包含了另一个基础树形模型中过滤后的值。你可以通过在过滤后的模型上调用 set_visible_func()
来决定哪些行应该显示出来。
还有另一种方法可以做到这一点。
另见: http://mail.gnome.org/archives/gtk-perl-list/2005-July/msg00065.html
(虽然是用perl写的,但转换成python应该不太难)
关键在于:
假设你有一个使用TreeStore作为模型的TreeView。而其中一列使用了一个下拉框单元格渲染器,这个下拉框每一行都会有一个ListStore模型:
你可以把ListStore放进TreeStore的列里,在perl中这会是一个类型为
Gtk2::ListStore
的列。当然,你不会直接在TreeView中显示这一列。相反:你可以让下拉框列在添加到TreeView时,使用TreeView中的这一列作为它的ListStore,方法是使用'insert_column_with_attributes',并把'model'属性连接到TreeStore的ListStore列。
当你向TreeView添加一行时,只需把一个完整的ListStore放进TreeStore的ListStore列中。然后你可以根据需要填充每一行的ListStore。