不过目前Glade3似乎在C上有BUG,别的语言没试过(主要是除了C不懂别的了

如果在Glade3中定义了处理函数:
void on_button1_clicked (GtkButton *self, gpointer user_data)
则实际运行中self = NULL, user_data = self
对此我的解决是。。。。,还是看代码算了

void on_button1_clicked (GtkButton *self, gpointer user_data);
// 准备传递的user_data数据结构
static struct U_Data {
int mal;
char str[100];
} button1_user_data = {0, "应用程序数据在此"};
// 定义一个简短的调用缩写,使用一个信号连接可在一行内写完,以便构建表格式连接代码块!写成宏也可,但是用函数可使编译器能更准确的定位语法错误
// SGC这个名字可能有些欠考虑,感觉和某些系统中定义的常量相近但含义相远吧
inline void SGC(GladeXML *gxml, const char *widget_name, const char *signal, void *func, gpointer user_date) {
g_signal_connect(
GTK_OBJECT(glade_xml_get_widget(gxml, widget_name)),
signal,
GTK_SIGNAL_FUNC(func),
user_date);
}
GtkWidget* create_window (void) {
GtkWidget *window;
GladeXML *gxml;
gxml = glade_xml_new (GLADE_FILE, NULL, NULL);
/* This is important */
glade_xml_signal_autoconnect (gxml);
window = glade_xml_get_widget (gxml, "window");
// 连接需要使用self, user_data的函数,因为目前Glade无法正确处理他们
SGC(gxml, "button1", "clicked", on_button1_clicked, &button1_user_data);
/* 如果不用SGC宏(函数)则以上调用将不适合写在一行内(见下),写在一行会很长,不便阅读。当然一个窗口中要连接的这种信号较多时
简单的写法应该会更易阅读和对大量信号连接的集中维护。
gtk_signal_connect(
GTK_OBJECT(glade_xml_get_widget(gxml, "button1")),
"clicked",
GTK_SIGNAL_FUNC(on_button1_clicked),
&button1_user_data);
*/
return window;
}
int main (int argc, char *argv[]) {
GtkWidget *window;
puts(argv[0]);
#ifdef ENABLE_NLS
bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif
gtk_set_locale ();
gtk_init (&argc, &argv);
window = create_window ();
gtk_widget_show (window);
gtk_main ();
return 0;
}
void on_button1_clicked (GtkButton *self, gpointer user_data) {
struct U_Data* data = (struct U_Data *)user_data;
data->mal ++;
printf("Button click (%d),信息:%s\n", data->mal, data->str);
}
以上做法经试验可行,不过这属于穿Glade3这个新鞋走老路的干法。不知道大家在解决这个问题时有何更好的办法,欢迎共同探讨(砖头是丢出去了,大家给来点玉吧)。
至于不用Glade3而继续用Glade2这个办法就请不要说了

