如何使用 vala 中的 set_cell_data_func 函数根据其内容更改单元格的布局?
Posted
技术标签:
【中文标题】如何使用 vala 中的 set_cell_data_func 函数根据其内容更改单元格的布局?【英文标题】:how to use the set_cell_data_func function in vala to change the layout of my cell depending on its content? 【发布时间】:2013-08-06 11:58:54 【问题描述】:我正在尝试在 Gtk.TreeViewColumn
上使用 set_cell_data_func
。我的代码可以编译,但在运行时会出现分段错误。我也试过insert_column_with_data_func
,但结果是一样的。
这是我的代码,希望你能帮助我:)
public class Application : Gtk.Window
public Application ()
this.destroy.connect (Gtk.main_quit);
this.set_default_size (600, 400);
Gtk.ListStore store = new Gtk.ListStore (2, typeof(int),
typeof(string));
Gtk.TreeIter iter;
store.append (out iter);
store.set (iter, 0, 0, 1, "A");
store.append (out iter);
store.set (iter, 0, 1, 1, "B");
store.append (out iter);
store.set (iter, 0, 0, 1, "C");
store.append (out iter);
store.set (iter, 0, 0, 1, "D");
Gtk.TreeView view = new Gtk.TreeView.with_model (store);
this.add(view);
Gtk.CellRendererText cell = new Gtk.CellRendererText ();
Gtk.TreeViewColumn col = new Gtk.TreeViewColumn.with_attributes (
"Value", cell, "text", 1);
col.set_cell_data_func (cell, (Gtk.CellLayoutDataFunc)render_value);
view.append_column (col);
public void render_value (Gtk.TreeViewColumn column, Gtk.CellRendererText
cell, Gtk.TreeModel model, Gtk.TreeIter iter)
var val = Value (typeof(int));
model.get_value (iter, 0, out val);
if ((int)val==1) (cell as Gtk.CellRendererText).background = "#b8cb04";
val.unset ();
public static int main (string[] args)
Gtk.init (ref args);
Application app = new Application ();
app.show_all ();
Gtk.main ();
return 0;
【问题讨论】:
【参考方案1】:在调试翻译后的 c 源代码后,我发现了这个错误。
vala
翻译
public void render_value (Gtk.TreeViewColumn column,
Gtk.CellRendererText cell,
Gtk.TreeModel model,
Gtk.TreeIter iter)
从您的代码到以下 c 等效项
void application_render_value (Application* self,
GtkTreeViewColumn* column,
GtkCellRendererText* cell,
GtkTreeModel* model,
GtkTreeIter* iter)
我将此与参考文档进行了比较。
数据函数的签名定义如下
void (*GtkCellLayoutDataFunc) (GtkCellLayout *cell_layout,
GtkCellRenderer *cell,
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer data);
关于您已实现的方法,这意味着参数向右移动了一位。所以以下适用于您的数据函数/方法
column
实际上是单元格渲染器
cell
是树模型
model
是迭代器和
iter
是传递给函数/方法的数据
如果您将数据函数/方法的声明更改为
public void render_value (Gtk.CellRendererText cell,
Gtk.TreeModel model, Gtk.TreeIter iter, Object data)
一切正常。
可能是因为CellLayoutDataFunc
被定义为public delegate void
。但由于我对vala
一无所知,这只是一个猜测。如果不是这种情况,您可以将其发布到相关的vala
邮件列表中。
【讨论】:
以上是关于如何使用 vala 中的 set_cell_data_func 函数根据其内容更改单元格的布局?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vala 中的 set_cell_data_func 函数根据其内容更改单元格的布局?