哪个是处理GtkMenu激活回调的最佳方法?

时间:2009-11-18 06:14:39

标签: gtk

我创建了一个包含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

2 个答案:

答案 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()替换它。你得到了垃圾,因为有了这两个功能,instanceuser_data都会被切换。所以你实际上是将指针menu_items转换为整数。像展开一样使用g_signal_connect()

但是,由于你之后可能只想做switch(selected_index),我建议为每个菜单项编写一个回调函数(例如on_new_selected()on_open_selected(),{ {1}}等)并分别连接每一个。