static void
print_hello (GtkWidget *widget,
gpointer data)
{
g_print ("Hello World\n");
}
static gboolean
on_delete_event (GtkWidget *widget,
GdkEvent *event,
gpointer data)
{
g_print ("delete event occurred\n");
return TRUE;
}
程序非常简单,只有一个顶层窗口和一个按钮。这就是回调的连接方式:
g_signal_connect (window, "delete-event", G_CALLBACK (on_delete_event), NULL);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
我的问题是关于我们传递给回调函数的参数。为什么在on_delete_event处理程序中我们传递第二个参数GdkEvent * data?
或者,为什么我们没有将这样的参数传递给第一个回调函数。在这种情况下,GdkEvent参数的用途是什么?
如果问题显示缺乏研究,我很抱歉,但对我而言,教程和the resource on event structures在描述回调时都不够清楚。
答案 0 :(得分:2)
信号具有不同的签名,就像函数具有不同的签名一样。
在上面的示例中:event
类上的GtkWidget
信号系列通常与GdkEvent
实例相关联,该实例详细说明了从窗口系统收到的事件。
仍然在上面的示例中:clicked
信号由GtkButton
发出,以响应一系列事件:按下按钮,然后在小部件本身的响应区域内释放按钮(也就是说,如果按下GtkButton
小部件上的指针按钮,则将指针移到按钮小部件外部并释放指针按钮,GtkButton
小部件将不会发出clicked
小部件信号)。因此,没有与之关联的GdkEvent
实例。
在尝试理解它们时,通常有助于将GObject信号视为可由特定类型实例调用的命名函数列表。