2011-04-09 4 views
0

나는 gtk 및 C GUI 프로그래밍의 초보자이며 C 응용 프로그램 용 GUI를 구현할 때 두 가지 구체적인 질문이 있습니다.gtk 콜백을 사용하여 호출 된 함수에서 값을 반환하는 방법은 무엇입니까?

  1. 코드에서 콜백을 통해 함수를 호출했으며이 함수는 값을 반환합니다. 함수에서 내 메인의 값을 얻는 방법?

  2. GTK를 사용하는 GUI에서 기본 또는 중첩 함수 호출에서 많은 함수 호출을 구현하는 가장 좋은 방법은 무엇입니까? 해야합니까 디자인 및 각 함수 호출시 새 창을 열어야합니다 그리고 그 경우 경우 어떻게 그 작업을 끝낼 때 또는 일부 방법은 내가 함수 호출에 걸쳐 같은 창에서 내용을 변경할 수 있습니다/O 기능에 의해.

샘플 코드 여기서 hello 함수는 main에서 콜백 호출 후 144 값을 반환하기를 원합니다.

#include <gtk/gtk.h> 

static gboolean delete_event(GtkWidget *widget, 
           GdkEvent *event, 
           gpointer data) 
{ 
    g_print ("delete event occurred\n"); 
    return FALSE; 
} 


int hello(GtkWidget *widget, gpointer data) 
{ 
    int a=144; 
    return a; 
} 


/* Another callback */ 
static void destroy(GtkWidget *widget, 
        gpointer data) 
{ 
    gtk_main_quit(); 
} 

int main(int argc, 
      char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *button; 

    int value; 

    gtk_init (&argc, &argv); 

    /* create a new window */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    g_signal_connect (window, "delete-event", 
       G_CALLBACK (delete_event), NULL); 
    g_signal_connect (window, "destroy", 
       G_CALLBACK (destroy), NULL); 
    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
    button = gtk_button_new_with_label ("Hello World"); 
    g_signal_connect (button, "clicked", 
       G_CALLBACK (hello), NULL); 

    //  printf("value is %d",value); 
    gtk_container_add (GTK_CONTAINER (window), button); 
    gtk_widget_show (button); 
    gtk_widget_show (window); 
    gtk_main(); 

    return 0; 
} 

답변

2

는 :

int value = 0; 
g_signal_connect (button, "clicked", G_CALLBACK (hello), &value); 

또한 신호의 콜백 프로토 타입을 존중해야합니다.

다음
void user_function (GtkButton *button, gpointer user_data) 

, 당신의 값을 반환 그냥 콜백 내부에서 변수를 수정 :

int hello (GtkWidget *widget, gpointer data) 
{ 
    int *a = data; 
    *a = 144; 
} 
코드에서는 GtkButton::clicked 신호의 경우,이입니다 ... 그것은 int를 반환했다

여러 값을 반환해야하는 경우 int 대신 struct를 사용하십시오.

두 번째 질문은 내게 매우 불분명하므로 답변을 드릴 수 없습니다.

+0

정말 고마워요. – anubhav

1

콜백에서 값을 다시 전달하는 방법 중 하나는 저장 장치에 대한 포인터를 g_signal_connect()으로 지정하는 것입니다. 그런 다음 해당 포인터를 처리기로 전달하여 핸들러에서 "반환 값"을 쓸 수 있습니다. 다른 함수의 주소 (또는 데이터와 함수 포인터를 포함하는 구조체의 주소 등)를 전달하여 처리 함수에서보다 복잡한 동작을 사용할 수도 있습니다.

두 번째 질문에 대해서는 이해할 수 없다고 생각합니다. 어쨌든 각 질문은 자체 게시물이어야합니다. 메인에서

0

다른 사람들처럼 콜백에서 데이터를 가져와야하는 경우 반환 할 수 없기 때문에 포인터를 전달하고 해당 위치의 값을 설정해야합니다.

실제로 일어나는 일에 대해 생각하면 이는 의미가 있습니다. 콜백을 실제로 호출하지 않는 g_signal_callback()을 호출 할 때 콜백을 설정하면 함수에 대한 포인터를 전달하는 것입니다. GTK는 나중에 사용할 수 있도록 내부적으로 저장합니다.

일단 gtk_main()을 호출하면 gtk 메인 루프로 프로그램을 제어 할 수 있습니다. 신호가 수신되면 gtk 메인 루프가 함수를 호출하지만 gtk 메인 루프 내부에서 무슨 일이 일어나고 있는지를 제어 할 수는 없으며 함수의 반환 값을 기대하지 않고 뭔가를 반환 할 수 있습니다. gtk에 무엇을 할 것인지를 알릴 방법이 없습니다.

관련 문제