APP下载

Linux下使用Gtk+/Glade进行GUI编程的研究*

2013-01-10王继魁

通化师范学院学报 2013年4期
关键词:图形化调用插件

王继魁

(吉林师范大学 计算机学院,吉林 四平 136000)

目前,Linux作为应用最广泛的免费、开源的操作系统,已经被越来越多的人所认可.Linux下的图形化系统X Widnows,使原本只有命令行操作的管理方式的Linux增添了图形化的操作方式,增强了Linux的易用性,降低了Linux入门的门槛.GNOME和KDE是Linux下最流行的图形化系统.KDE是一个基于Qt GUI库的开源桌面环境,KDE是采用GPL规范进行发行的,但底层基础的Qt却是一个非GPL商业软件,这就增加了Qt的局限性;GNOME选择完全遵循GPL的GTK图形界面为基础,因此得到了商业公司的广泛支持.

本文主要介绍了基于Linux的GNOME桌面环境下GTK+开发库的基本知识及使用方法.虽然GTK+可采用C语言等过程化程序设计语言,但能通过GObject库支持对象和面向对象编程,可以使用相应的构件,构造出图形化的用户界面.文中通过一个实例课件程序演示了利用Glade界面生成器开发基于GTK+工具的GUI应用程序的步骤和方法.

1 GTK+简介

GTK+一开始是作为流行的GNU图像处理程序GIMP的一部分产生的,这也是GTK得名的原因(Gimp ToolKit的缩写).因为GTK+已经逐渐发展成功能最强大和最受欢迎的工具包之一,所以GIMP程序设计者颇有远见地将GTK+变为一个独立的项目.

尽管GTK+是一个与GIMP一样的GNU项目,但它使用的是更自由的LGPL许可证(Lesser General Public License).LGPL允许人们使用GTK+来编写软件(包括源代码不开放的私有软件)而不用支付任何使用费、版税,并且不受其他的限制.GTK+许可证所提供的自由度与它的竞争者Qt恰成对比,后者的GPL许可证禁止使用Qt开发商业软件.

GTK+完全是用C语言编写的,而且绝大多数GTK+软件也是用C语言编写的.但可以在许多其它语言中使用GTK+,如C++、Python、PHP、Ruby、Perl、C#、Java.

2 GTK+对象系统

尽管GTK+是完全用C语言编写的,但是它通过GObject库支持对象和面向对象编程.这个库通过宏来支持对象继承和多态.每一个GTK+的GUI元素都是由一个或许多个“widgets”对象构成的.所有的widgets都从基类GtkWidget派生.例如,应用程序的主窗口是GtkWindow类widget,窗口的工具条是GtkToolbar类widget.一个GtkWindow是一个GtkWidget,但一个GtkWidget并不是一个GtkWindow,子类widgets继承自父类并扩展了父类的功能而成为一个新类,这就是标准的面向对象编程思想.我们可以查阅GTK+参考手册找到widgets直接的继承关系.对于GtkWindow它的继承链如下:

GObject

+----GInitiallyUnowned

+----GtkObject、

+----GtkWidget

+----GtkContainer

+----GtkBin

+----GtkWindow

因此,GtkWindow继承自GtkBin,GtkBin继承自GtkContainer,等等.

3 GTK+的事件、信号和回调函数

所有的GUI库都必须存在预设的机制来响应用户动作并运行对应的程序.GTK+是一个事件驱动的工具包,程序运行时它会等在gtk_main()函数上,当用户触发下一事件后,才把控制权传给适当的函数.GTK+的事件响应机制称为信号回调函数.当用户触发下一事件,如单击鼠标左键,被按的构件会“发出”适当的信号.即通过“信号”来传递程序的控制权.要设置信号和回调函数之间的关联才能让构件完成相应的动作.可以这样设置回调函数:

void a_callback_function(GtkWidget *widget,gpointer user_data);

其中传递了两个参数:第一个参数是指向发出信号的构件指针,第二个参数是当你连接回调函数时自己选择的一个任意指针.

只需要调用g_signal_connect()函数就可以设置信号与回调函数之间的连接.其语法格式如下:

gulong g_singal_connect(gpointer *object,

const gchar *name,

GCallback func,

Gpointer user_data);

第一个参数是要发出信号的构件,第二个参数是你想要连接的信号的名称,第三个参数是信号被捕获时所要调用的函数,第四个参数是你想传递给这个函数的数据.

连接函数没有任何限制,可以将多个信号连接到同一个回调函数,也可以将多个回调函数连接同一个信号.

4 GMoudle

动态链接库是Linux系统核心中的重要组成部分,插件则可以将应用程序的不同的功能放在动态链接库中进行单独的管理;关键的一点是插件不像动态链接库那样,由操作系统来统一装载和卸载;而是由应用程序自己来装载,这样就减轻了系统资源的占用,也增强了应用程序的灵活性.

GTK+的底层基础GLib中提供了插件编程功能,称为GMoudle.它为实现插件功能提供了快捷的方法,用非常简单的方法实现了动态加载插件和调用插件中的函数的功能.

如果你编写的应用程序要用到GModule插件功能,就必须在编译时加入`pkg-config--libs gmoudle-2.0`以完成最后程序运行的需要.

5 Glade简介

Glade是一种开发GTK+应用程序的RAD(Rapid Application Development)工具.Glade自身就是一个GTK+应用程序,因为它就是用GTK+开发出来的.Glade用来简化UI控件的设计和布局操作,进行快速开发.Glade的设计初衷是把界面设计与应用程序代码相分离,界面的修改不会影响到应用程序代码,Glade设计的界面保存为glade格式文件,它实际上是一种XML文件.Glade起初能根据创建的GUI自动生成C语言代码,然后利用Libglade库在运行时动态创建界面.如今的Glade3没有继承以上的方法.因为,Glade需要做的唯一的事就是生成一个描述如何创建GUI的glade文件.这给编程人员提供了更多的灵活性和易用性,避免因用户界面部分微小的改变就要重新编译整个应用程序;同时使其和程序设计语言无关,几乎所有的编程语言都可以使用Glade.

6 实例

本实例主要实现生成哈希码的教学程序.GUI主要由一个菜单栏、两个文本框、两个按钮、一个状态栏组成.实现的程序用C语言编写,在Xwindows环境下调用glade设计GUI界面.实现过程如下:

6.1 GUI界面设计

确定系统安装了glade3包.本例使用的是glade3-3.8.2.在Xwindows图形界面下,从Applications菜单下的programming子菜单中选择Glade Interface Designer.

图1 Glade的设计界面

调出glade3界面如图1所示.在工具栏下界面主要分为三部分.左端是palette窗口,是glade的图形构件的集合;中间是设计界面的工作区域;右端分为上下两部分,上部是inspector窗口,显示设计的构件树,下部是properties窗口,显示的构件各种属性.设计中用到了GtkVBox、GtkHBox、GtkMenuBar、GtkEntry、GtkEntry、GtkStatusbar等构件.设计好后,保存为hasher.glade.

为保证glade文件和程序需要的xml文件格式相匹配,在Linux文本状态下执行如下命令:

gtk-builder-convert hasher.glade hasher.xml

6.2 程序编写

主要代码如下:

#include

#include //MD5 hash

typedef struct {//程序的构件

GtkWidget *window1;

GtkWidget *entry1;

GtkWidget *entry2;

GtkWidget *label1;

} AppWidgets;

void check_hash(UNUSED,AppWidgets *app){…}//验证哈希码函数

void generate_hash(UNUSED,AppWidgets *app){…}//生成哈希码函数

int main(int argc,char**argv){

GtkBuilder *builder;

AppWidgets*app=g_slice_new(AppWidgets);

gtk_init(&argc,&argv);

builder=gtk_builder_new();

gtk_builder_add_from_file(builder,“hasher.xml”,&err);

//取得构件句柄

#define appGET(xx)〗app->xx=GTK_WIDGET(gtk_builder_get_object(builder,#xx))

appGET(entry1);appGET(entry2);appGET(label1);appGET(window1);

gtk_builder_connect_signals(builder,app);//回调函数

g_object_unref(G_OBJECT(builder));

gtk_main();

g_slice_free(AppWidgets,app);

return 0;

}

6.3 信号回调方法

信号回调的过程分两阶段:

①在Glade设计时,signal选项卡中指定的回调函数应该在信号发出时被调用.

②在程序运行时,回调函数的调用分两种方式.第一种方式是使用gtk_builder_connect_signals()函数,此函数能自动查找与主程序中相匹配的回调函数并予以调用,整个过程通过GModule来实现;第二种方式是使用gtk_builder_connect_signals_full()函数,此函数是需要用户自己指定哪个回调函数被调用.

该程序是使用了第一种方式自动匹配回调函数,使用自动化的过程减少人工编写代码的繁琐过程.

6.4 Makefile文件的编写

Makefile文件是由一组依赖关系和规则构成.每个依赖关系由一个目标和一组该目标所依赖的源文件组成.而规则描述了如何通过这些依赖文件创建目标.本实例的Makefile文件如下.

NAME=hasher

INCLUDES=-I.

CFLAGS=-g-Wall-pedantic$(shell pkg-config--cflags--libs gtk+2.0 gmodule-export-2.0) -export-dynamic -std=c99 -lcrypto

all:

gcc ${CFLAGS} -c ${NAME}.c -o ${NAME}.o

gcc ${NAME}.o -o ${NAME} ${CFLAGS}

clean:

rm -f ${NAME}

编写好Makefile文件后,运行make命令来进行编译和连接.最后,在Xwindows的终端窗口里输入./hasher运行程序,运行结果如图2.

图2 程序运行结果

随着Linux操作系统图形化进程的推进,对GUI应用程序的需求量也会越来越大.本文介绍GTK+和Glade的基本内容,通过一个课件实例程序演示了利用Glade界面生成器开发基于GTK+工具的GUI应用程序的步骤和方法,对Linux下的GUI应用程序的开发具有一定的指导性.

参考文献:

[1]Neil Matthew,Richard Stones Beginning Linux Programming[M].4th Edition Wilery Publishing,Inc.,2008.

[2]The GTK+Project[EB/OL].The GTK+Project http://www.gtk.org/

[3]Glade-A User Interface Designer[EB/OL].Glade-A User Interface Designer http://glade.gnome.org/

猜你喜欢

图形化调用插件
基于Arduino图形化编程的教学应用研究
自编插件完善App Inventor与乐高机器人通信
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
LKJ自动化测试系统图形化技术研究
基于jQUerY的自定义插件开发
基于Revit MEP的插件制作探讨
网络图形化界面在高速公路机电设施养护管理系统中的应用
利用RFC技术实现SAP系统接口通信
插件体系结构软件的原理和实现