首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确使用GtkTreeView

如何正确使用GtkTreeView
EN

Stack Overflow用户
提问于 2010-12-23 00:22:00
回答 1查看 4.7K关注 0票数 5

我使用的是带有ListStore as模型的TreeView。当用户单击行时,我想执行一些操作,但不使用单元格中的值,而是使用我从中创建行的数据...

目前,我有TreeView、TreeModel (ListStore)和我自己的数据(讽刺的是我称之为模型)。

所以问题是:

拥有一个模型--我想要显示的数据的对象表示,并用要在TreeView中显示的数据填充ListStore --是“正确的”吗?还是实现一个自己的TreeModel版本(包装我的数据模型)来显示数据会更好?

还有:

如果有人在一行中双击,我可以获得RowActivated事件(使用C#/Gtk#),它提供了到激活行的路径。这样我就可以得到一个TreeIter,用它我就可以得到一个单元格的值。但是,找到最初构造行的数据对象的最佳实践是什么?\(不知何故,这个问题让我想到了第一个问题--我想,如果我尝试实现自己的TreeModel,获取数据对象会更容易……)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-23 02:56:44

实现TreeModel相当笨拙/困难,所以大多数人只是简单地将数据从他们的“真实”模型同步到TreeStore或ListStore。

存储中的列不必以任何方式与视图中的列匹配。例如,您可以拥有一个包含实际托管数据对象的列。

将单元渲染器添加到TreeView (可视)列时,可以在其属性和存储的列之间添加映射。例如,您可以将一个store列映射到文本单元格渲染器的字体,将另一个store列映射到同一could渲染器的text属性。每次使用cell渲染器呈现特定的单元格时,映射都将用于从存储中检索值,并在呈现器呈现之前将它们应用于渲染器的属性。

下面是一个映射示例:

代码语言:javascript
运行
复制
treeView.AppendColumn ("Title", renderer, "text", 0, "editable", 4);

这会将存储列0映射到渲染器的text GTK属性,并将存储列4映射到editable属性。对于GTK属性名称,您可以检查GTK docs。请注意,上面的示例使用了一种方便的方法,该方法添加了一个列,向其中添加了一个渲染器,并通过params添加了任意数量的映射。要将映射直接添加到列,例如具有多个渲染器的列,请将渲染器打包到列中,然后使用TreeViewColumn.AddAttributeTreeViewColumn.SetAttributes

您还可以设置一个自定义数据函数,该函数将用于代替映射。这允许您在给定TreeIter和存储的情况下直接设置渲染器的属性-因此,如果您想要显示的所有数据都是从真实数据对象中简单地派生出来的,您甚至可以让您的存储只包含这些对象的单列,并对所有视图列使用数据函数。

下面是一个数据函数的示例,它的功能与上面的映射示例完全相同:

代码语言:javascript
运行
复制
treeColumn.SetCellDataFunc (renderer, delegate (TreeViewColumn col,
    CellRenderer cell, TreeModel model, TreeIter iter)
{
    var textCell = (CellRendererText) cell;
    textCell.Text = (string) model.GetValue (iter, 0);
    textCell.Editable = (bool) model.GetValue (iter, 4);
});

显然,数据函数要强大得多,因为它们不仅使您能够使用更复杂的GTK对象的属性,而且还使您能够实现更复杂的显示逻辑-例如,只有在实际呈现单元格时才懒惰地处理派生值。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4511218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档