如何使用 GenericTreeModel 呈现自定义列

发布于 2024-08-30 21:53:07 字数 366 浏览 10 评论 0原文

我必须在树视图中显示一些数据。 “真正的”数据模型很大,我无法复制 TreeStore 中的所有内容,所以我想我应该使用 GenericTreeModel 来充当虚拟树视图。顺便说一句,第一列是经典的图标+文本样式,我想我应该声明一个带有 CellRendererPixbuf 的列(常见问题解答示例),但我不确定模型方法 on_get_n_columns()on_get_value() > 应该返回。它既是同一列的 Pixbuf 又是字符串值。

I have to display some data in a treeview. The "real" data model is huge and I cannot copy all the stuff in a TreeStore, so I guess I should use a GenericTreeModel to act like a virtual treeview. Btw, the first column is the classic icon+text style and I think I should declare a column with a CellRendererPixbuf (faq sample), but I'm not sure what the model methods on_get_n_columns() and on_get_value() should return. It's both a Pixbuf and a string value for the same column.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世态炎凉 2024-09-06 21:53:07

查看教程,有一个将两个单元格渲染器打包到一列的示例。不同之处在于,您使用的是自定义树模型,其行为取决于您对模型进行建模的方式。如果您有一列包含文本,一列包含 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)

我希望我能让您了解可以做什么和一个起点。免责声明:我没有测试代码。

Look at the tutorial, there is an example that packs two cell renderer to one column. The difference is that you are using a custom tree model and the behavior depends on how you modeled your model. If you have one column with the text and one column with the pixbuf you can use 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

You can have otherwise a tree model with just one column with the objects that contains all you need, so just set a callback:

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)

I hope I give you an idea of what you can do and a start point. Disclaimer: I did not test the code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文