如何使用 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 函数根据其内容更改单元格的布局?

如何从 Vala 中的字符串创建 InputStream

如何使用Vala将GStreamer视频输出到Gdk.Pixbuf?

如何在 Vala 中使用 Qt GUI?

如何在 Vala 中使用 CCode 属性?

如何在 vala 中使用 gtk/glade