![]() |
在 2.0 版,信号系统已从 GTK 移到 GLib,因此在函式和型别的说明中有前置 “g_” 而不是 “gtk_”。我们不打算介绍 GLib 2.0 信号系统相对 GTK 1.2 信号系统扩展的细节。 |
在我们详细分析 helloworld 程式之前,我们会讨论信号和回呼函式。GTK 是一个事件驱动的工具包,意味着它会等在 gtk_main() 那里,直到下一个事件发生,才把控制权传给适当的函式。
控制权的传递是使用“信号”的办法来完成的。(注意这里的信号并不等同于 Unix 系统里的信号,并且也不是用它们实现的,虽然使用的术语是一样的。) 当一个事件发生时,如按一下滑鼠键,所按的元件会“发出”适当的信号。这就是 GTK 的工作机制。有所有元件都继承的信号,如 “destroy”,有元件专有的信号,如开关 (toggle) 按钮发出的 “toggled” 信号。
要使一个按钮执行一个动作,我们需设置信号处理函式来捕捉这些信号以及呼叫适当的函式。可以这样使用函式来设置:
gulong g_signal_connect( gpointer *object, const gchar *name, GCallback func, gpointer func_data ); |
第一个参数是要发出信号的元件,第二个参数是你想要捕捉的信号名称,第三个参数是信号被捕获时所要呼叫的函式,第四个参数是你想传递给这个函式的资料。
第三个参数指定的函式叫做回呼函式,一般为下面的形式:
void callback_func( GtkWidget *widget, |
第一个参数是一个指向发出信号的元件的指标,最后一个参数是一个指向资料的指标,就是上面 g_signal_connect() 函式的最后一个参数传进来的资料。
注意上面回呼函式的声明只是一般的形式,有些元件的特殊信号会用不同的呼叫参数。
另一个在 helloworld 范例中使用的呼叫,是:
gulong g_signal_connect_swapped( gpointer *object,const gchar *name, GCallback func, gpointer *slot_object ); |
除了在呼叫处理常式时实体的讯号发出以及资料交换时之外,g_signal_connect_swapped() 和 g_signal_connect() 是相同的。所以当使用这个函式连接信号时,回呼函式应该是这样的形式
void callback_func( gpointer callback_data, |
这个物件通常是一个元件。然而我们一般不用函式 g_signal_connect_swapped() 设置回呼。它们在讯号被发射在一些其他物件时,常用来呼叫一个只接受一个单独的元件或者物件作为参数的 GTK 函式,在 helloworld 范例里,我们在按钮上连结”clicked”讯号,但是在视窗上呼叫gtk_widget_destroy()。
假如你的回呼需要额外的资料,使用 g_signal_connect() 而不是 g_signal_connect_swapped()。

1 則留言
Comments are closed.