关于 glade 的问题

软件和网站开发以及相关技术探讨
回复
snriyt
帖子: 31
注册时间: 2009-07-15 21:37

关于 glade 的问题

#1

帖子 snriyt » 2010-05-26 15:09

ui文件中定义了这个信号的数据:

代码: 全选

 <signal name="clicked" handler="on_button1_clicked" object="data"/>
信号处理函数:

代码: 全选

void  on_button1_clicked (GtkButton *self, gpointer user_data)
{
	g_print("%p-%p\n", self, user_data);
      g_print("hello %s\n", (char *)user_data);
	
}
运行结果:
(nil)-0x1896840
hello

把用户数据去掉以后,运行就正常:
0x6de840-(nil)
hello (null)


anjuta 2..30..1
glade 3..6..7

这是什么情况?
snriyt
帖子: 31
注册时间: 2009-07-15 21:37

Re: 关于 glade 的问题

#2

帖子 snriyt » 2010-05-26 15:48

我知道了user_data是如何传送的了,但是它跟self是反的,这点要如何处理?
snriyt
帖子: 31
注册时间: 2009-07-15 21:37

Re: 关于 glade 的问题

#3

帖子 snriyt » 2010-05-26 15:49

:em06 好像明白了,转换一下两个参数用就是了,结贴了
snriyt
帖子: 31
注册时间: 2009-07-15 21:37

Re: 关于 glade 的问题

#4

帖子 snriyt » 2010-05-26 16:23

当按下button时,会在label上显示hello world.
顺便把自己的测试贴出来:

代码: 全选

struct data_t
{
	gpointer label;
	gpointer win;
}data;

GtkWidget*
create_window (void)
{
	GtkWidget *window;
	GtkWidget *label;
	GtkBuilder *builder;
	GError* error = NULL;

		
	builder = gtk_builder_new ();
	if (!gtk_builder_add_from_file (builder, UI_FILE, &error))
	{
		g_warning ("Couldn't load builder file: %s", error->message);
		g_error_free (error);
	}

	window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
	label = GTK_WIDGET(gtk_builder_get_object (builder, "label1"));
	data.win = window;
	data.label = label;
	/* This is important */
	gtk_builder_connect_signals (builder, &data);	

	g_object_unref (builder);	
	return window;
}


int
main (int argc, char *argv[])
{
 	GtkWidget *window;


#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)
{
	g_print("%p-%p\n", self, user_data);
	struct data_t *data = (void *)self;
	GtkLabel *label = data->label;
	gtk_label_set_text (label, "hello,word\n");
	
	//gtk_main_quit ();
}
不过这里的self好像跟glade中设置的用户数据没有关系,还要测试
回复