基于 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 文件,可以通过文本编辑器查看,代码如下。 (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 |
|