Как визуализировать пользовательские столбцы с GenericTreeModel - PullRequest
1 голос
/ 29 апреля 2010

Я должен отобразить некоторые данные в виде дерева. «Реальная» модель данных огромна, и я не могу скопировать все вещи в TreeStore, поэтому я думаю, что я должен использовать GenericTreeModel, чтобы действовать как виртуальное древовидное представление. Кстати, первый столбец - это классический значок + стиль текста, и я думаю, что я должен объявить столбец с CellRendererPixbuf ( faq sample ), но я не уверен, какие методы модели on_get_n_columns() и on_get_value() должен вернуться. Это и Pixbuf, и строковое значение для одного и того же столбца.

1 Ответ

0 голосов
/ 29 апреля 2010

Посмотрите на учебник , есть пример, который упаковывает два средства визуализации ячеек в один столбец. Разница в том, что вы используете пользовательскую модель дерева, и поведение зависит от того, как вы смоделировали вашу модель. Если у вас есть один столбец с текстом и один столбец с pixbuf, вы можете использовать set_attributes:

column = gtk.TreeViewColumn('Pixbuf and text')
cell1 = gtk.CellRenderText()
cell2 = gtk.CellRenderPixbuf()
column.pack_start(cell1, True)
column.pack_start(cell2, False)
column.set_attribute(cell1, 'text', 0) # the first column contains the text
column.set_attribute(cell2, 'pixbuf', 1) # the second column contains the pixbuf

В противном случае у вас может быть древовидная модель с одним столбцом с объектами, которые содержат все необходимое, поэтому просто установите обратный вызов:

class MyObject:
    def __init__(self, text, pixbuf):
        self.text = text
        self.pixbuf = pixbuf

def cell1_cb(col, cell, model, iter):
    obj = model.get_value(iter)
    cell.set_property('text', obj.text)

def cell2_cb(col, cell, model, iter):
    obj = model.get_value(iter)
    cell.set_property('pixbuf', obj.pixbuf)

column = gtk.TreeViewColumn('Pixbuf and text')
cell1 = gtk.CellRenderText()
cell2 = gtk.CellRenderPixbuf()
column.pack_start(cell1, True)
column.pack_start(cell2, False)
column.set_cell_data_func(cell1, cell1_cb)
column.set_cell_data_func(cell2, cell2_cb)

Надеюсь, я дам вам представление о том, что вы можете сделать, и начальную точку. Отказ от ответственности: я не проверял код.

...