gtk+ 编程:回调函数的参数

问题描述 投票:0回答:1

以下代码片段来自 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参数有什么用?

如果问题表明缺乏研究,我很抱歉,但对我来说,无论是教程还是有关事件结构的资源在描述回调方面都不够清晰。

c gtk gnome gtk3
1个回答
2
投票

信号具有不同的签名,就像函数具有不同的签名一样。

在上面的示例中:

event
类上的
GtkWidget
信号系列通常关联一个
GdkEvent
实例,该实例详细说明从窗口系统接收到的事件。

仍然是上面的示例:

clicked
信号由
GtkButton
发出,以响应一系列事件:按下按钮,然后在小部件本身的响应区域内释放按钮(也就是说,如果您按下
GtkButton
小部件上的指针按钮,然后将指针移到按钮小部件之外并释放指针按钮,
GtkButton
小部件将不会发出
clicked
信号)。因此,没有与其关联的
GdkEvent
实例。

在尝试理解 GObject 信号时,将 GObject 信号视为可由特定类型实例调用的命名函数列表通常会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.