2009-11-18 3 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); 

을 그리고 다음하지만 쓰레기를 받고으로 _ 데이터 변환하기 위해 노력했다.

gint selected_index = GPOINTER_TO_INT(user_data); 

감사합니다, PP

답변

0

, 그것은 더 이상 사용되지 않으며 g_signal_connect_swapped()로 대체합니다. 두 기능 모두에서 instanceuser_data이 바뀌기 때문에 쓰레기가 나옵니다. 따라서 실제로 포인터를 menu_items으로 정수로 변환하고 있습니다. unwind says와 같이 g_signal_connect()을 사용하십시오. 당신은 아마 그 후 switch(selected_index)을 할거야 이후

그러나, 나는 각 메뉴 항목 (예를 들어 on_new_selected(), on_open_selected(), on_save_selected() 등)에 대한 하나 개의 콜백 함수를 작성하는 것이 좋습니다 것 개별적으로 각각 연결. 내가 int로 _ 데이터를 변환 할 때 GINT_TO_POINTER()와 GPOINTER_TO_INT(), 열거하지만 난 콜백 기능에 쓰레기를 얻고으로 시도

+0

이것을 쓰기 대답으로 선택한 이유는 내가 틀린 gtk_signal_connect_object – User7723337

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의를 사용하지만 조금 너무 많은 기술처럼 느낄 수 있습니다, 명령의 수에 따라 달라집니다 당신은 함께 일해야합니다. gtk_signal_connect_object()를 사용하지 마십시오

+0

. 왜 이런 일이 일어날까요? 업데이트 된 질문을 참조하십시오. – User7723337

관련 문제