Как визуализировать пользовательские столбцы с помощью GenericTreeModel

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


person Giorgio Gelardi    schedule 29.04.2010    source источник
comment
Ваши данные огромны, потому что в них много строк или потому, что каждая строка содержит большие данные?   -  person krawyoti    schedule 29.04.2010
comment
много рядов. и столбцы тоже, но мне нужно показать только некоторые из них.   -  person Giorgio Gelardi    schedule 29.04.2010


Ответы (1)


Посмотрите руководство, там есть пример, который упаковывает два средства визуализации ячеек в один столбец. Разница в том, что вы используете пользовательскую модель дерева, а поведение зависит от того, как вы смоделировали свою модель. Если у вас есть один столбец с текстом и один столбец с 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)

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

person mg.    schedule 29.04.2010
comment
кажется именно то, что я искал (первый случай, отдельная иконка и текст в модели), я проверю это сегодня вечером, спасибо - person Giorgio Gelardi; 29.04.2010
comment
хорошо, я попробовал, и решение было именно учебным: наличие универсальной модели или чего-то еще за древовидной структурой не имеет значения. Спасибо. - person Giorgio Gelardi; 04.05.2010