我是gtk和C gui编程的初学者,在为我的C应用程序创建GUI时有两个具体的问题。
我在代码中通过回调调用了一个函数,该函数应该返回一个值。如何从函数中获取我的主要值?
使用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;
}
答案 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;
}
如果需要返回多个值,请使用struct而不是int。
你的第二个问题我不清楚,所以我无法回答。
答案 1 :(得分:1)
从回调传递值的一种方法是将指针指向g_signal_connect()
的某个存储。然后该指针将传递给您的处理程序,处理程序可以在那里写入“返回值”。您还可以传递另一个函数的地址(或包含数据和函数指针的结构的地址,或其他),以在处理函数中启用更复杂的行为。
关于你的第二个问题,我认为我不理解,无论如何,每个问题都应该是自己的帖子。
答案 2 :(得分:0)
正如其他人所说,如果您需要从回调中获取数据,那么您需要传入指针并在该位置设置值,因为您无法返回。
如果您考虑实际发生的事情,这是有道理的。当你在调用g_signal_callback()时设置回调时你实际上并没有调用你的回调,你只是传递一个指向你的函数的指针,然后GTK会在内部存储以供以后使用。
一旦调用gtk_main(),就可以将程序控制权交给gtk主循环。在那里,当收到信号时,gtk主循环将调用你的函数,但你无法控制gtk主循环内发生的事情,它不期望你的函数返回值,如果你可以返回一些东西,你' d无法告诉gtk如何处理它。