GtkTreeviewColumn为每行使用不同的组合模型

2 投票
2 回答
903 浏览
提问于 2025-04-16 03:20

我有一组全局的值,比如 ["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 个回答

3

你要找的是 gtk.TreeModelFilter。它是一个树形模型,里面包含了另一个基础树形模型中过滤后的值。你可以通过在过滤后的模型上调用 set_visible_func() 来决定哪些行应该显示出来。

2

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

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

(虽然是用perl写的,但转换成python应该不太难)

关键在于:

假设你有一个使用TreeStore作为模型的TreeView。而其中一列使用了一个下拉框单元格渲染器,这个下拉框每一行都会有一个ListStore模型:

  1. 你可以把ListStore放进TreeStore的列里,在perl中这会是一个类型为Gtk2::ListStore的列。当然,你不会直接在TreeView中显示这一列。相反:

  2. 你可以让下拉框列在添加到TreeView时,使用TreeView中的这一列作为它的ListStore,方法是使用'insert_column_with_attributes',并把'model'属性连接到TreeStore的ListStore列。

  3. 当你向TreeView添加一行时,只需把一个完整的ListStore放进TreeStore的ListStore列中。然后你可以根据需要填充每一行的ListStore。

撰写回答