GTK+ 综述
作者: 刘鹏
日期: 2008-09-12
本文对 GTK+ 做了概括性介绍。

简介

GTK+, 即,GIMP ToolKit,是一个简单易用、特征丰富的图形用户接口工具集, 它具有很好的跨平台性和简单易用的 API。之所以叫 GIMP ToolKt,是因为它最 初是为了开发 GIMP 而写的,现在已经在很多项目中使用,如 GNOME。

尽管 GTK+ 采用 C 语言开发,但采用了很多面向对象的设计思想,通过一些技 巧用 C 语言实现了面向对像中的封装、继承、多态等机制。它使用了类和回调函数。

GTK+ 采用 LGPL 协议发布,可用于开发 open, free 和商业软件。

除了提供 C 接口之外,GTK 还支持与多种语言的绑定,如 C++, Guile, Perl, Python, TOM, Ada95, Objective C, Free Pascal, Eiffel, Java and C# 等。

体系结构

GTK+ 由以下几个部分组成:

  • GLib:一个底层库,封装了基本的数据结构操作、底层功能接口以及平台相 关的代码。它是 GTK+ 的基础;
  • GDK (GIMP Drawing Kit),封装了底层访问窗口系统的函数,如 X window 系统中的 Xlib;
  • gdk-pixbuf,一个客户端的图像处理库;
  • Pango:一个文本布局和渲染库,着重解决国际化功能。它是 GTK+2.0 文本 和字体处理的核心;
  • Cairo:一个 2D 图形库,支持多种输出设备(如 X window, Win32),支持硬 件加速功能;
  • ATK:一组提供访问性的接口,支持 screen reader, magnifiers 和其它的输入设备。

信号与 callback

当一个事件发生时,比如鼠标按键按下,被点击的 widget 就会发出对应的信号。 有些信号是所有 widget 都有的,如 destroy ,也有些信号是 widget 特有的, 如 toggle 按钮的 toggled 信号。

要按钮完成一个动作,需要设置一个信号处理函数来捕获和处理信号,这通过下 面的函数实现:

g_signal_connect( gpointer      *object,
                         const gchar   *name,
                         GCallback     func,
                         gpointer      func_data );


  • object:发出信号的 widget;
  • name:信号名称;
  • func:信号处理函数;
  • func_data:传递给函数的数据。

信号处理函数格式如下:

void callback_func( GtkWidget *widget,
                    ... /* other signal arguments */
                    gpointer   callback_data );
  • widget:是发出信号的 widget;
  • callback_data:是传递进函数的数据。

事件

除了上面讲的信号机制,GTK 还有事件机制。回调函数也可以挂载到事件上。这 些事件包括:

event
button_press_event
button_release_event
scroll_event
motion_notify_event
delete_event
destroy_event
expose_event
key_press_event
key_release_event
enter_notify_event
leave_notify_event
configure_event
focus_in_event
focus_out_event
map_event
unmap_event
property_notify_event

要将回调函数与事件建立联系使用 g_signal_connect() 函数。使用事件名作为 name 参数。事件的回调函数与信号的回调函数在格式上略有不同:

gint callback_func( GtkWidget *widget,
                    GdkEvent  *event,
                    gpointer   callback_data

中间加了 event 参数。

举个例子:

g_signal_connect (G_OBJECT (button), "button_press_event",
                  G_CALLBACK (button_press_callback), NULL);

这里 button 是 Button widget,当鼠标在 button 上按下时,button_press_callback() 将会被调用。这个函数声明如下:

static gboolean button_press_callback( GtkWidget      *widget,
                                       GdkEventButton *event,
                                       gpointer        data );

函数返回值表示事件是否被转发。返回 TRUE 表示事件已被处理,不需转发。返 回 FALSE ,事件转发给父窗口,由 GTK 事件处理机制处理。

一个事件可以有多个信号处理函数,它们按顺序依次执行。

Widget

GTK 创建一个 widget 的步骤:

  • gtk_*_new ();
  • 为信号和事件建立处理函数并建立映射;
  • 设置 widget 的属性;
  • 将 widget 放在到一个 container 中,通常使用 gtk_container_add() 或 者 gtk_box_pack_start() 等函数;
  • gtk_widget_show ()。

组装构件 (Packing Widgets) 有两种方式:

  • 组装盒 (Packing Boxes)
  • 表 (Tables)