2009-11-18 61 views
1

我创建了一个包含10个GtkMenuItems的GtkMenu,并将activate事件附加到每个菜单项中,但是在回调函数中,我应该如何了解哪个菜单项实际被选中?哪个是处理GtkMenu激活回调的最好方法?

我自己添加的呼叫回GtkMenuItem如下:

gtk_signal_connect_object(GTK_OBJECT(menu_items), "activate", 
           GTK_SIGNAL_FUNC(on_option_selected), 
           (gpointer)GINT_TO_POINTER(i)); 

和我的回调函数如下:

gboolean on_option_selected(GtkWidget *widget, gpointer user_data); 

并试图转换USER_DATA如下,但得到的垃圾。

gint selected_index = GPOINTER_TO_INT(user_data); 

感谢, PP

回答

0

请勿使用gtk_signal_connect_object(),它已弃用,由g_signal_connect_swapped()替代。你会得到垃圾,因为使用这两种功能,instanceuser_data都会切换。所以你实际上是将指针转换为menu_items为一个整数。使用g_signal_connect()就像unwind说的那样。

但是,因为你可能只是去后做一个switch(selected_index),我建议你写的每一个菜单项(例如on_new_selected()on_open_selected()on_save_selected()等)一个回调函数,并分别连接各一个。

+0

选择这个作为写回答因为我这样做错了gtk_signal_connect_object – User7723337 2009-11-20 13:56:57

3

最简单的方法是使用gpointer user_data参数回调编码本,不知何故。

例如,您可能会传递一个枚举,使用GINT_TO_POINTER()GPOINTER_TO_INT()宏来回转换。枚举可能类似于

enum { FILE_NEW, FILE_OPEN, FILE_SAVE, FILE_SAVEAS, FILE_QUIT }; 

或类似的。该连接(假设最近的GTK + 2.x的)应该是这样的:

g_signal_connect(G_OBJECT(item_saveas), "activate", G_CALLBACK(on_option_selected), GINT_TO_POINTER(FILE_SAVEAS)); 

或者你可以全力以赴,并使用GtkAction S,但可能会觉得有点过分工程,取决于命令的数量你需要与之合作。

+0

尝试使用枚举GINT_TO_POINTER()和GPOINTER_TO_INT(),但当我将user_data转换为int时,我在回调函数中获取垃圾。为什么会发生这种情况?请参阅更新的问题。 – User7723337 2009-11-18 08:10:49