Каков наилучший способ обработки обратного вызова GtkMenu? - PullRequest
1 голос
/ 18 ноября 2009

Я создал GtkMenu с 10 GtkMenuItems в нем и прикрепил событие activate к каждому элементу меню, но в функции обратного вызова как узнать, какой пункт меню был фактически выбран?

Я добавил Перезвонить в 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 ]

3 голосов
/ 18 ноября 2009

Самый простой способ - использовать аргумент gpointer user_data для обратного вызова, чтобы как-то его кодировать.

Вы можете, например, передать enum, используя макросы 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));

Или вы можете использовать все возможности и использовать <a href="http://library.gnome.org/devel/gtk/stable/GtkAction.html" rel="nofollow noreferrer">GtkAction</a> s, но это может показаться слишком сложным, зависит от количества команд, с которыми вам нужно работать.

0 голосов
/ 18 ноября 2009

Не используйте 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(), on_save_selected() и т. Д.) и соединяя каждый в отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...