gtk中treeviewcolumns需要单元渲染器的逻辑
根据我对GTK的了解,如果我有一个TreeView(树形视图),我不能随便用任何小部件来显示某一列的信息。比如说,如果要显示文本,就得用gtk.CellRendererText
。如果要用切换按钮,就得用gtk.CellRendererToggle
。至于其他类型的显示,似乎就得自己去实现,而我看到的一个关于按钮的示例,看起来并不简单。
首先,真的是这样吗?有没有简单的方法可以设置你想用来显示文本的小部件?如果没有,那为什么要这样设计呢?如果是我来设计GTK,我会创建一个系统,当添加一行或者某些数据模型的信息发生变化时,用户指定的回调函数会被调用,这样就可以添加合适的小部件或者进行相应的更改。
1 个回答
要写一个自定义的单元格渲染器(从这个链接复制过来的!):
首先,你需要在类型系统中注册一些你的渲染器需要的新属性,并编写自己的 set_property 和 get_property 函数,用来设置和获取这些新属性。
接下来,写一个自己的 cell_renderer_get_size 函数,并覆盖父对象的这个函数(通常父对象是 GtkCellRenderer 类型)。注意,这里要遵循父对象的标准属性,比如内边距和单元格对齐。
然后,编写自己的 cell_renderer_render 函数,并覆盖父对象的这个函数。这个函数负责实际的渲染工作。
写一个自定义的单元格渲染器并不难,难点在于如何写一个自定义的控件。如果你已经学会了如何写自定义控件,那么写自定义的单元格渲染器就简单多了。
这个设计背后的逻辑是灵活性。一个 TreeViewColumn 指示数据(来自 TreeModel)应该如何通过单元格渲染器显示,因此一个表示布尔值的 TreeViewColumn 可以显示为文本(CellRendererText),也可以显示为复选框(CellRendererToggle)。例如,一个表示整数值的 TreeViewColumn 可以显示为文本(CellRendererText),也可以显示为进度条(CellRendererProgress),或者可以显示为旋转按钮(CellRendererSpin),甚至可以显示为我们想要的任何形式。