如何使用vala中的set_cell_data_func函数根据其内容更改单元格的布局?

问题描述:

我试图在Gtk.TreeViewColumn上使用set_cell_data_func。我的代码编译但运行时出现分段错误。我也试过insert_column_with_data_func,但结果是一样的。如何使用vala中的set_cell_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; 
    } 
} 

调试转换过来的C源,我发现这个Bug。

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);  

对于您已经实现,这意味着该参数是由一个向右移动的方法。所以下面适用于您的数据FUNC /法

  • column实际上是在单元格渲染器
  • cell是树模型
  • model是Iterator和
  • iter被传递到数据函数/方法

如果将数据func/method的声明更改为

public void render_value (Gtk.CellRendererText cell, 
          Gtk.TreeModel model, Gtk.TreeIter iter, Object data) 

一切都应该正常工作。

也许这个原因是CellLayoutDataFunc被定义为public delegate void。但因为我对vala一无所知,这只是一个猜测。如果不是这种情况,您可以在相关的vala邮件列表上发布。