2011-04-09 158 views
0

我是gtk和C gui編程的初學者,在爲我的C應用程序實現GUI時有兩個具體問題。如何從使用gtk回調調用的函數返回值?

  1. 我已經在我的代碼中調用了一個回調函數,函數應該返回一個值。如何從函數中獲取我的主值?

  2. 在使用GTK的GUI中,通過主或嵌套函數調用來實現多個函數調用的最佳方式是什麼?我應該設計並打開每個函數調用的新窗口,如果是這種情況,那麼當它的工作結束時如何關閉它,或者我有一些方法,其中我可以在一些函數調用後改變同一個窗口的內容/ O的功能。

示例代碼,其中我希望函數hello在main中通過callback調用後返回值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); 

您還必須尊重信號的回調原型。在你的代碼,你做它返回一個int ...對於GtkButton::clicked信號,這就是:

void user_function (GtkButton *button, gpointer user_data) 

然後,返回你的價值,只是修改變量從回調中:

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

如果您需要返回多個值,請使用結構而不是int。

你的第二個問題對我來說很不清楚,所以我無法回答。

+0

非常感謝。 – anubhav 2011-04-12 08:26:30

1

從回調中傳回值的一種方法是將指向某個存儲器的指針指向g_signal_connect()。然後該指針將傳遞給您的處理程序,該處理程序可以在其中寫入其「返回值」。你也可以傳遞另一個函數的地址(或者包含數據和函數指針的struct的地址,或者其他),以便在你的處理函數中實現更復雜的行爲。

至於你的第二個問題,我不認爲我理解它,無論如何,每個問題應該是它自己的帖子在這裏。

0

正如其他人所說,如果您需要從回調中獲取數據,那麼您需要傳遞一個指針並在該位置設置值,因爲您無法返回。

如果您考慮實際發生的情況,這是有道理的。當你在調用g_signal_callback()時設置回調函數的時候,你實際上並沒有調用你的回調函數,而只是傳遞一個指向你的函數的指針,然後GTK將被存儲在內部供以後使用。

一旦你打電話給gtk_main(),你就可以把你的程序的控制權交給gtk主循環。在那裏,當收到信號時,gtk主循環會調用你的函數,但是你不能控制gtk主循環中發生了什麼,它不會期望函數返回值,如果你可以返回一些東西, d沒有辦法告訴gtk該怎麼做。

相關問題