我创建了一个包含10个GtkMenuItems的GtkMenu,并将activate
事件附加到每个菜单项,但在回调函数中,我应该如何知道实际选择了哪个菜单项?
我已将Call回复给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 :(得分: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
,但这可能感觉有点太多工程,取决于你需要使用的命令数量。
答案 1 :(得分:0)
请勿使用gtk_signal_connect_object()
,不推荐使用g_signal_connect_swapped()
替换它。你得到了垃圾,因为有了这两个功能,instance
和user_data
都会被切换。所以你实际上是将指针menu_items
转换为整数。像展开一样使用g_signal_connect()
。
但是,由于你之后可能只想做switch(selected_index)
,我建议为每个菜单项编写一个回调函数(例如on_new_selected()
,on_open_selected()
,{ {1}}等)并分别连接每一个。