Glade是一款很方便的GTK界面编写工具。几乎可以把所有的GtkBuilder可以支持的所有控件。在使用Glade中最普遍的问题如果通过Glade来设置空间的信号回调函数后,那个“用户数据”参数是如何传递的。

以按钮控件clicked信号回调函数为例,其原型是:

void user_function(GtkButton *self, gpointer data);

而在Glade的信号回调函数绑定设置对话框里,也有操作句柄(对应回调函数函数名)、用户数据(user_data)这两个设置项。

在Glade里设置“用户数据”中输入的东西,其实就代表Glade中的对象。比如在Glade中有个名为window窗口,在这里输入“window”,那么在回调函数中,gpointer data就等于gtk_builder_get_object(builder,“window”)。

不过需要注意的是GTK代码在这里有个BUG。当没有在Glade中设置用户数据时,上面的推论是正确的。当设置了用户数据时,实际测试发现,data和self搞反了。也就是说:

<li>当没有设置“用户数据”时,self指向组件本身对应的GObject,user_data指向NULL。即:

self = gtk_builder_get_object(builder,“组件名”);

data = NULL;

<li>当设置“用户数据”时,self指向用户数据设置的对象,而user_data指向组件本身。即

self = gtk_builder_get_object(builder,“用户数据中设置的对象名”);

data = gtk_builder_get_object(builder,“组件名”);