GTK入门教程

时间:2022-10-18 15:01:11

GTK入门教程

1.GTK简介

      GTK(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。当然,GTK也是支持跨平台的,支持Unix类的系统、Windows,甚至手机平台。

      GTK是使用C语言写的,所以其原生API都是面向C的,同时GTK的一大特点是,在C语言层面实现了面向对象的特性。GTK是完全免费的,而且基于LGPL协议,这可以保证私有软件通过链接使用GTK可以不把软件源代码开放,对商业应用较友好,这跟GPL协议是不一样的。也正是LGPL协议,使得早些年Gnome(基于GTK编写)风头胜过KDE(基于QT编写)。

      GTK+ 从目前的发展趋势来看,越来越成为 Linux 和 GNOME 的 native toolkit,对于跨平台的考虑越来越少了。GNOME 目前仍是 Linux 平台最主流的桌面系统,而像 Pantheon、Cinnamon 等桌面也只是 GNOME 换了个壳,底层也是 GNOME 技术栈,所以 GTK+ 在这方面仍会大有发展。

GTK入门教程


2.GTK和GTK+

      上面只是说了gtk,但我要学习的是gtk+。它们之间有什么关系呢?gtk+的作者之一PerterMattis说他原来开发的gtk包含了三套函数库, libglib、libgdk,和 libgtk,这些库没有采用面向对象机制,因而无法实现构件的复用,而且消息机制是使用标准的回调机制实现的,而非现在的gtk+所提供的信号机制。“+”是用来区分原始版本和新版本的。gtk+依然是完全使用C语言开发的,但在设计上灵活运用了面向对象设计(OOD)思想(谁说只有C++、java、C#这样的语言可以OOD 呢)。

3.Linux下第一个GTK程序

3.1 查看系统是否安装了GTK

  pkg-config命令可查看安装库的详细信息。

$ pkg-config  --list-all | grep gtk
gtk-sharp-3.0 Gtk - Gtk
gtk+-unix-print-2.0 GTK+ - GTK+ Unix print support
gtk+-x11-2.0 GTK+ - GTK+ Graphical UI Library (x11 target)
gtk+-2.0 GTK+ - GTK+ Graphical UI Library (x11 target)

3.2 第一个GTK程序示例

GTK入门教程

#include <gtk/gtk.h>
int main(int argc,char *argv[])
{
/* GtkWidget 是构件的存储类型 */
GtkWidget *window;
/*每一个GTK程序都要调用*/
gtk_init(&argc, &argv);
/*创建一个新的窗口*/
window= gtk_window_new(GTK_WINDOW_TOPLEVEL);
/*设置窗口标题*/
gtk_window_set_title(GTK_WINDOW(window),"GTK Hello");
/*设置窗口大小*/
gtk_widget_set_usize(window, 200, 200);
/*显示窗口*/
gtk_widget_show_all (window);
/*所有的 GTK 程序必须有一个 gtk_main() 函数。
程序运行停在这里等待事件 (如键盘事件或鼠标事件) 的发生。 */
gtk_main();
return 0;
}
  • 程序编译:
gcc main.c  `pkg-config --cflags --libs gtk+-2.0`

 编译参数:

        pkg-config --cflags gtk±2.0 列出include 目录,pkg-config --libs gtk±2.0列出编译连接库,也可以合在一起,像这样:pkg-config --cflags --libs gtk±2.0。

        这里使用了“命令替换”。 命令替换(commandsubstitution)使得可以捕获一个命令的输出而在另一个命令中替换它。这个单引号不是回车键左边的那个,而是 ESC 键下面的那个。

  • 连接时常用的库:
 GTK (-lgtk),构件库,基于GDK。
GDK (-lgdk),Xlib库的封装(wrapper)
gdk-pixbuf (-lgdk_pixbuf),图像处理库。
Pango (-lpango),处理国际化文本。
gobject (-lgobject),包含作为 GTK 基础的类型系统。
gmodule (-lgmodule),动态运行库。
GLib (-lglib),包含各种函数; GTK是基于 GLib 的,因此你总需要这个库。
Xlib (-lX11),GDK 要使用。
Xext (-lXext),包含共享内存位图和其它 X 扩展。
math (-lm),数学库,这个被 GTK 因各种目的而使用。

3.3相关函数接口介绍

  1. gtk初始化gtk_init

​void gtk_init (int *argc, char ***argv)

函数功能: gtk初始化,会在每个gtk程序中调用。该函数设定了默认的视频(visual)和颜色映射模式(color map)。

  1. gkt主处理循环gtk_main

​void gtk_main (void)

函数功能: 当程序运行到这里,GTK 会“睡着”等待 X 事件 (如按钮或键盘按下)、超时(timeouts)或文件 IO 通知发生。但是在调用gtk_main_quit函数以前,对gtk_main函数的调用并不返回,即使你关闭了窗口,程序仍然在运行(上述示例演示了此效果),在这种情况下,我们在调用gtk_main函数之前应该先建立回呼函数,而且设置GTK+使得在出现某些信号时转而执行应用软件,由应用软件接着进行处理。


  • 参考资料:
    1. GTK2.0+入门教程
    2. GTK官网:https://www.gtk.org/