上一篇中的示例运行时,点击关闭按钮,窗口会自动关闭,但终端中的提示符却不见了。其实完全可以关闭终端窗口,在开启一个。不过最好的办法是按下Ctrl+C组合键,这样提示符就出现了。为什么会出现这种情况呢?上面示例中只调用了主事件循环gtk_main,而未对来自用户的信号做任何处理,所以即使窗口关闭了,循环仍在循环,程序并未真正的退出。按下Ctrl+C组合键,系统向此程序发出了中断信号,程序才真正的终止执行。
对程序稍加修改:
#include<gtk/gtk.h>
int main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "Hello World");
gtk_window_set_default_size(GTK_WINDOW(window),400,300);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
编译运行点击关闭按钮就可以完全退出程序了。
gtk采用了一种信号和回调函数机制来处理窗口外部传来的事件、消息或信号。即先为窗口或控件定义一系列信号,在编程中引用信号名称为窗体或控件添加回调函数,
当信号发生时,程序自动调用为信号连接的回调函数。
gtk退出程序时要调用gtk_main_quit(),它的功能是退出主循环,也就是结束程序的运行。一般情况下当窗口关闭时程序就退出了,但并不主动处理退出程序,这就需要为delete_event信号连接回调函数。
为窗口或者控件加回调函数有两种方式:
一种是直接调用已有函数比如gtk_main_quit,在窗口创建完成后直接引用g_signal_connect宏。如:g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
另一种是先定义好回调函数。在窗口或控件创建完成后再引用g_signal_connect宏。
如:void on_delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
gtk_main_quit();
}
主函数中这样引用g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(on_delete_event),NULL);