如何从使用gtk回调调用的函数返回值?

问题描述:

我是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; 
} 

在你的主:

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

从回调中传回值的一种方法是将指向某个存储器的指针指向g_signal_connect()。然后该指针将传递给您的处理程序,该处理程序可以在其中写入其“返回值”。你也可以传递另一个函数的地址(或者包含数据和函数指针的struct的地址,或者其他),以便在你的处理函数中实现更复杂的行为。

至于你的第二个问题,我不认为我理解它,无论如何,每个问题应该是它自己的帖子在这里。

正如其他人所说,如果您需要从回调中获取数据,那么您需要传递一个指针并在该位置设置值,因为您无法返回。

如果您考虑实际发生的情况,这是有道理的。当你在调用g_signal_callback()时设置回调函数的时候,你实际上并没有调用你的回调函数,而只是传递一个指向你的函数的指针,然后GTK将被存储在内部供以后使用。

一旦你打电话给gtk_main(),你就可以把你的程序的控制权交给gtk主循环。在那里,当收到信号时,gtk主循环会调用你的函数,但是你不能控制gtk主循环中发生了什么,它不会期望函数返回值,如果你可以返回一些东西, d没有办法告诉gtk该怎么做。