配色: 字号:
9-2 基于GTK+的图形用户界面编程
2022-12-16 | 阅:  转:  |  分享 
  

基于 GTK+ 的图形 用户界面 编程

Ubuntu 不断 改善用户的桌面系统体验, 其桌面版提供的图形桌面环境越来越出色, 图形
界面应用程序的开发日益重要。GTK 和 Qt 是 跨平台的图形界面开发工具和框架,由于源代
码开放, 现已成为 Linux 平台主流的 图形用户界面 (GUI) 应 用程序开发框架。 下面主要讲解
基于 GTK+ 的图形界面编程环境。
1. 什么是 GTK+
GTK+ 是一套跨多种平台的开放源码图形用户界面工具包。 最初, 它是作为另一个著名的
开放源码项目 GIMP (类似于 Photoshop 的图像处 理程序) 的副产品创建的。 这个副产品称为
GTK (GIMP Toolkit ) ,后来为这个工具包增加了面向对象特性和可扩展性,并将 其 改称为
GTK+ 。GTK+ 库通常也称为 GIMP 工具包, 目前主要使用的是 GTK+3.0 版本。 目前最新版本
已将“+ ”去掉,被称为 GTK 4 。
GTK+ 类似于 Windows 上的 MFC 和 Win32 API、J AVA 上的 Swing 和 SWT 。GTK+ 目前
已发展为一个功能强大、设计灵活的一个通用图形函数库。随着 GNOME 使用 GTK+ 开发,
使得 GTK+ 成为 Linux 下开发 GUI 应用程序的主流开发工具之一。
GTK+ 可以用来进行跨平台 GUI 应用程序的开发。GTK+ 虽然是用 C 语言写 的, 但是程 序
员可以使用熟悉的编程语言来使用 GTK+ ,因为 GTK+ 已被绑定到几乎所有流行的语言上,
如 C++(gtkmm)、 Perl 、Ruby 、Java、Ada 、Python (PyGTK)和 PHP, 以及所有的.NET 编
程语言。GTK+ 最早应用于 X Window System ,如 今已移植到其他平台,如 Windows 。
GTK+ 开发套件基于 3 个 主要的库:Glib 、Pango 和 ATK 。开发人员只需关心如何使用
GTK+ ,由 GTK+ 自己负责与这 3 个 库打交道。GTK+ 及相关的库按照面向对象设计思想来实
现。它每一个 GUI 元素 都是由一个或多个“widgets ”对象构 成的。所有的 widgets 都 从基类
GtkWidget 派 生。 例如, 应 用程序的主窗口是 GtkWindow 类 widget , 窗口的工 具条是 GtkToolbar
类 widget。一 个 GtkWindow 是一个 GtkWidget, 但一个 GtkWidget 并不是 一个 GtkWindow ,
子类 widgets 继承自父类 并扩展了父类的功能而成为一个新类。以 Gtk 开头的所有对象都是
在 GTK+ 中定义的。
GNOME 桌 面环境以 GTK+ 为基础,为 GNOME 编写的程序使用 GTK+ 作为其工具箱。
但要注意的是,GNOME 程序和 GTK+ 程序并不等同,GTK+ 提供了基本工具箱和窗口小部件
(如按钮、标签和输入框) ,用于构 建 GUI 应用 程序。GTK+ 也可以运行在 KDE 的环境下,
还可以在 Windows 上运行。Firefox 浏览器、Geany 代码编辑器和 GIMP 图像处理程序等都是
用 GTK+ 开发的开源软件,可以运行于 Linux 、Windows 等 多种操作系统平台上。
2. 部署 GTK+ 编程环境
(1 )安装 GTK+ 开发包
部署 GTK+ 编程环境首先要提供 gcc 、g++、gdb、make 等编译工具,然后要安装核心的
GTK+ 开发包,执行以下命令安装 GTK+ 3 开发包 。
sudo apt install libgtk-3-dev
可以执行以下命令检查是否安装了 GTK+ 3 ,查看所安装的具体版本。
tester@linuxpc1:~$ pkg-config --modversion gtk+-3.0
3.24.20
(2 )测试 GTK+ 编程
这里给出一个简单的源程序进行实际测试。在主目录中创建一个名为 testgtk.c 的源 代码
文件,其内容如下:
#include
int main(int argc,char argv[])
{
Ubuntu Linux 操作系统实战(微课版)
/ 声明GtkWidget 构件 /
GtkWidget window;
GtkWidget label;
/ 调用GTK 初始化函数 ,这在 所有的GTK 程序中都要 调用/
gtk_init(&argc,&argv);
/ 创建主 窗口/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/ 为该窗 口设 置标题/
gtk_window_set_title(GTK_WINDOW(window),"Hello World");

/ 将窗口的destroy 信号连 接到函数gtk_main_quit
当窗口 要被销 毁时,获 得通告 ,停止主GTK+ 循环 /
g_signal_connect(window,"destroy",G_CALLBACK(gtk_main_quit),NULL);
/ 创建“Hello, World”标 签 /
label = gtk_label_new("Hello, World!");

/ 将标签 加入 到主窗口 /
gtk_container_add(GTK_CONTAINER(window),label);
/ 显示所 有的GtkWidget 构件,包括 窗口、 标签/
gtk_widget_show_all(window);
/ GTK 程序必 须有一个gtk_main()函数启 动主循环 ,等待 事件发生 并响应 ,直到应 用结束 /
gtk_main();
return 0;
}
执行以下命令进行编译。
tester@linuxpc1:~$ gcc testgtk.c -o testgtk `pkg-config --cflags --libs gtk+-3.0`
接着运行所生成的可执行文件:
tester@linuxpc1:~$ ./testgtk
结果会显示一个带有一个标签的窗口, 标签中显示 “Hello World ! ” , 窗口 的标题为 “Hello
World”, 如 图 1 所示。

图 1 带窗口的 应用程序
(3 )pkg-config 工具
前面用到过 pkg-config 工 具,这里有必要讲解一下。如果库的头文件不在/usr/include 目
录中,则通 常在编译的 时候需要用-I 选项指定其 路径。由于 同一个库在 不同系统上 可能位 于
不同的目录下, 用户安装库的时候也可能将库安装在不同的目录下, 所以即使使用同一个库,
由于库的路 径不同,使 用-I 选项指 定的头文件 的路径也可 能不同,结 果就造成编 译命令 界 面
的不统一。另外,即使使用-L 选项指定库文件,也会造成连接界面的不统一。编译和连接界
面一致性的问题的一个解决办法是事先将库的位置信息等保存起来,需要时再通过特定的工
具将其中有用的信息提取出来供编译和连接使用。目前最为常用的库信息提取工具就是
pkg-config 。
pkg-config 是 通过库提供的一个.pc 文 件获得库的各种必要信息的,包括版本信息、编译
和连接需要的参数等。这些信息可以通过 pkg-config 提供的 参数单独提取出来直接供编译器
和连接器使用。 默认情况下每个支持 pkg-config 的 库对应的.pc 文件在安装后都位于安装目录
中的 lib/pkgconfig 目录下 。

2 项目9 部署软件开发工作站
使用 pkg-config 的-cflags 选项可以给出编译时所需要的选项,而-libs 选 项可以给出连接
时所需的选项。上例用到了 gtk+ 库 ,可以这样进行编译:
gcc –c testgtk.c `pkg-config --cflags gtk+-3.0`
然后再这样进行连接:
gcc testgtk.o -o testgtk `pkg-config --libs gtk+-3.0`
还可以将编译和连接两个步骤合并为一个步骤:
gcc testgtk.c -o testgtk `pkg-config --cflags --libs gtk+-3.0`
由于使用 pkg-config 工具 来获得库的选项,所以不论库安装在什么目录下,都可以使用
相同的编译和连接命令。
使用 pkg-config 工具提取 库的编译和连接参数有以下两个基本的前提。
? 库本身在 安装时必须提供一个相应的.pc 文 件。
? pkg-config 必须知道要 到何处去寻找.pc 文件。
GTK+ 及其依 赖库支持使 用 pkg-config 工具,通过设置搜索 路径来解决 寻找库对应 的.pc
文件的问题,库的头文件的搜索路径的设置变成了对.pc 文 件搜索路径的设置。.pc 文件的搜
索路径是通过环境变量 PKG_CONFIG_PATH 来设置的, pkg-config 将按照 设置路径的先后顺
序进行搜索,直到找到指定的.pc 文 件为止。
3. 使用 Glade 辅助设 计界面
Glade 是一个 图形界面设计工具, 使用 Glade 可 以使得基于 GTK+ 及 GNOME 桌面环境的
图形界面开发变得更加快速和便捷。 如果不使用 IDE 开发 GTK+ 程序, 则一般要先使用 Glade
生成图形界面,然后使用文本编辑器编写代码,再使用调试器。
(1 )Glade 简介
直接用 GTK+ 编写 GUI 应用程序并不轻松, 使用 C 语言代码 编写各种图形界面的工作量
不小。为解决此问题,推出了 GTK+ 图形用户界面产生器 Glade。Glade 是 一种开发 GTK+ 应
用程序的快速应用开发(RAD)工具。它自身就是用 GTK+ 开发出来的可视化设计工具,用
来简化 UI 控件的设计和布局操作,进行快速开发。
Glade 的设计 初衷是将界面设计与应用程序代码分离, 界面的修改不会影响到应用程序代
码。Glade 原 先能根据创建的 GUI 自 动生成 C 语言代码,后来可以利用 Libglade 库在 运行时
动态创建界面, 现在的 Glade 3 版本 则将设计的界面保存为 glade 格式文 件, 它实际上是一种
用于描述如何创建 GUI 的 XML 文件 。这给编程人员提供了更多的灵活性,避免了用户界面
部分微小的改变就要重新编译整个应用程序,同时其语言无关性使得几乎所有的编程语言都
可以使用 Glade 。
用 Glade 设计的用户界面是以 XML 格式的文件保存的,它们可以通过 GTK+ 对象
GtkBuilder 被 应用程序动态地载入。 通过 GtkBuilder ,Glade XML 文件可以被许多编程语言使
用,包括 C 、C++ 、C# 、Vala、Java、Perl 、Python 等。
(2 )Glade 安装
Glade 是在 GNU GPL 许可 证下的自由软件。 在 Ubuntu 系统中 执行以下命令安装 Glade 3
工具。
sudo apt install glade
Glade 需要 GTK+ 3 支 持。
(3 )使用 Glade 设计图形 用户界面
在命令行中执行 glade 命 令, 或者从应用程序列表中找到 Glade 界面设计器 并运行, 启动
Glade 程序, 单击 按钮创建一个 Glade 项目,如 图 2 所示。

3 Ubuntu Linux 操作系统实战(微课版)

图 2 新建一 个 Glade 项目
使用 Glade 设计界面比较简单直观,这里给出一个简单的例子进行示范。
第 1 步,在 中间工作区顶部工具栏上单击“顶层”按钮弹出图 3 所示 的对话框,选择顶
层容器, 这里选择 “GtkWindow ” 窗口组件, 这时在中间的空白工作区会出现一个深色方框,
作为程序的主窗口。可以根据需要在右侧属性设置对话框修改此窗口的属性,这里在“ID”
框中输入“window1”。
第 2 步,在 中间工作区顶部工具栏上单击“显示”按钮弹出图 4 所示 的对话框,选择显
示组件,这里选择“GtkLabel ”标签组件,将该组放到中间工作区中的窗口中,并在“ID”
框中输入“label1”。

图 3 选择顶层容器 图 4 选择显示组件
第 3 步,确 认选中该标签,在右侧调度属性设置对话框设置此窗口的属性。这里将标签
设置为“Hello World!” 。 此时整个项目如图 5 所示 。

4 项目9 部署软件开发工作站

图 5 Glade 项目
Glade 界面可 以有多个层次,顶层窗口下面可以有容器。
第 4 步,界 面设置完成后可保存项目,单击“保存”按钮弹出文件保存对话框,选择合
适的文件夹,并给文件命名(这里为 hello.glade)。
该文件就是一个简单的 XML 文件,可以通过文本编辑器查看,代码如下。





False





True
False
Hello World!




(4 )GTK+ 结合 Glade 进行编程
使用 Glade 生成图形界面后,还要再编写程序代码来调用 Glade 文件作 为程序界面。这
一步很关键。Glade 文件 的本质是个 XML 文件, 这个文件可以用 GtkBuilder 对象载入 并生成
界面。这里给出一个简单的例子,结合上例的 Glade 文件实 现图形用户界面程序。
#include

int main (int argc, char argv[])
{
GtkBuilder builder;
GtkWidget window;

gtk_init (&argc, &argv);


5 Ubuntu Linux 操作系统实战(微课版)
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "hello.glade", NULL);

window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
gtk_builder_connect_signals (builder, NULL);

g_object_unref (G_OBJECT (builder));

gtk_widget_show_all(window);
gtk_main ();

return 0;
}
将上述源程序保存为 testglade.c 文件 ,然后进行编译。
tester@linuxpc1:~$ gcc testglade.c -o testglade `pkg-config --cflags --libs
gtk+-3.0`
完成编译生成可执行文件即可进行测试,将显示一个图 6 所示的窗口程序。
tester@linuxpc1:~$ ./testglade


图 6 基于 Glade 文件实现的 窗口程序

即使使用 Glade 生成用户 界面,如果使用传统编程方式,也还需要使用一系列工具,如
文本编辑器、GCC 编译 器、GDB 调试器、make 工具、Autotools 工具等, 开发效率仍然不高,
仅这些工具的组合和切换就比较费时费力。而采用 IDE 则 可大大简化程序开发,提高开发效
率。Anjuta 就是适合 GTK+ 开发的 IDE ,可以将所有的开发任务都放在一个统一、集成的环
境下一并完成。

6
献花(0)
+1
(本文系籽油荃面原创)