在《在Ubuntu下GTK编程笔记(一)》中,我们讲述了gtk环境的构筑,以及制
作了一个简单的HelloWorld程序,在本节中我们对HelloWorld程序进行展开,介绍
gtk的信号和回调机制。
所有的GUI库都有一个共同点:必须有某种机制响应用户动作以执行代码。命令行
程序有奢侈的做法:就是暂停执行,等待用户输入,然后采用switch语句等机制使程
序根据输入不同而分支执行。这种做法对GUI应用程序是不现实的,因为应用程序必
须不断地响应用户输入,例如她需要不断地更新窗口区域。
现代窗口系统是由事件和事件监听系统来解决这个问题的。笔者接触到最早的事件
程序是用VB写的,其思想是,每次用户输入都触发一个事件。程序员只需编写监听事
件以及事件触发时执行的代码。
相应地,GTK有自己的事件和事件监听系统,叫做信号(signal)和回调函数(callback)。
它们非常简单易用,因为你可以用C语言的一个有用的特征——函数指针来设置信号
处理器。
GTK信号:当某件事发生时GtkObject对象发出的数据。
回调函数:与信号连接,一旦信号发出就会被调用的函数。
典型的回调函数的原型:
void a_callback_function ( GtkWidget *widget, gpointer user_data);
参数1:指向发出信号的窗口部件的指针;
参数2:回调函数与信号连接时定义的任一指针。
连接回调函数,只需要调用g_signal_connect函数就可以了:
gulong g_signal_connect (gpointer *object, const gchar *name,
GCallback func, gpointer user_data);
※连接回调函数没有任何限制。可以将多个信号连接到一个回调函数,也可以将
多个回调函数连接到一个信号。
以上,是GTK信号和回调函数的介绍,下面就HelloWorld程序进行分析:
HelloWorld程序中定义的回调函数:
2 gtk_main_quit();
3 }
连接回调函数的方法:
GTK_SIGNAL_FUNC(closeApp), NULL);
效果:window窗口发出destroy信号时,将执行回调函数closeApp,
使程序正常终止。
※有兴趣的读者可以试试:当去掉以上代码时,点击关闭按钮时,依然
可以关闭窗口,但是程序本身并没有被终止掉。
----------------------------------------------------------------------------