GTK+ 2.0 教程--信号和回调函数的原理

类别:软件工程 点击:0 评论:0 推荐:

信号和回调函数的原理


 在 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,
                    gpointer   callback_data );

第一个参数是一个指向发出信号的构件的指针,第二个参数是一个指向数据的指针
,就是 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() 相同,只是回调函数只用
一个参数,一个指向 GTK 对象的指针。所以当使用这个函数连接信号时,回调函
数应该是这样的形式

void callback_func( GtkObject *object );

这个对象常是一个构件。然而我们通常不用函数 g_signal_connect_swapped() 设
置连接。它们常被用在只接受一个单独的构件或者对象的回调函数中作为参数,如
同我们的 helloworld 示例中那样。

拥有两个设置信号连接函数的目的是简单的允许回调函数有不同数目的参数。
GTK 库中许多函数仅接受一个单独的构件指针作为其参数,所以对于这些函数你要
用 g_signal_connect_swapped(),然而对你自己定义的函数,你需要附加的数据
提供给你的回调函数。

本文地址:http://com.8s8s.com/it/it36561.htm