如何从使用gtk回调调用的函数返回值?
我是gtk和C gui编程的初学者,在为我的C应用程序实现GUI时有两个具体问题。如何从使用gtk回调调用的函数返回值?
我已经在我的代码中调用了一个回调函数,函数应该返回一个值。如何从函数中获取我的主值?
在使用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。
你的第二个问题对我来说很不清楚,所以我无法回答。
从回调中传回值的一种方法是将指向某个存储器的指针指向g_signal_connect()
。然后该指针将传递给您的处理程序,该处理程序可以在其中写入其“返回值”。你也可以传递另一个函数的地址(或者包含数据和函数指针的struct的地址,或者其他),以便在你的处理函数中实现更复杂的行为。
至于你的第二个问题,我不认为我理解它,无论如何,每个问题应该是它自己的帖子在这里。
正如其他人所说,如果您需要从回调中获取数据,那么您需要传递一个指针并在该位置设置值,因为您无法返回。
如果您考虑实际发生的情况,这是有道理的。当你在调用g_signal_callback()时设置回调函数的时候,你实际上并没有调用你的回调函数,而只是传递一个指向你的函数的指针,然后GTK将被存储在内部供以后使用。
一旦你打电话给gtk_main(),你就可以把你的程序的控制权交给gtk主循环。在那里,当收到信号时,gtk主循环会调用你的函数,但是你不能控制gtk主循环中发生了什么,它不会期望函数返回值,如果你可以返回一些东西, d没有办法告诉gtk该怎么做。
非常感谢。 – anubhav 2011-04-12 08:26:30