以下代码片段来自 here 给出的 GNOME GTK+ 3 教程。
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参数有什么用?
如果问题表明缺乏研究,我很抱歉,但对我来说,无论是教程还是有关事件结构的资源在描述回调方面都不够清晰。
信号具有不同的签名,就像函数具有不同的签名一样。
在上面的示例中:
event
类上的GtkWidget
信号系列通常关联一个GdkEvent
实例,该实例详细说明从窗口系统接收到的事件。
仍然是上面的示例:
clicked
信号由 GtkButton
发出,以响应一系列事件:按下按钮,然后在小部件本身的响应区域内释放按钮(也就是说,如果您按下 GtkButton
小部件上的指针按钮,然后将指针移到按钮小部件之外并释放指针按钮,GtkButton
小部件将不会发出 clicked
信号)。因此,没有与其关联的 GdkEvent
实例。
在尝试理解 GObject 信号时,将 GObject 信号视为可由特定类型实例调用的命名函数列表通常会有所帮助。