Linux下GTK+自定义控件的设计和使用

2015-08-04 06:07李国玲
科技与创新 2015年15期
关键词:工具包

李国玲

摘 要:GTK+是一套跨多种平台的图形工具包,它提供了多种界面库元素供用户调用。但是,已有的界面库元素仅能保证基础的界面应用程序开发,当用户需要特定功能的界面库元素时,自定义控件的设计和使用就显得尤为重要。结合工作实践,对GTK+自定义控件的设计和使用进行了总结,以期为对GTK+感兴趣的爱好者们提供参考。

关键词:GTK+;界面库;自定义控件;工具包

中图分类号:TP311.52 文献标识码:A DOI:10.15913/j.cnki.kjycx.2015.15.115

文章编号:2095-6835(2015)15-0115-02

2013年的凌镜门事件把国家信息安全推到了风口浪尖,随着互联网的飞速发展,全球信息化的不断加速,信息安全也越来越受到人们的重视。国外软硬件产品藏有后门的消息此起彼伏,国内市场对于国产软硬件的需求愈发强烈。仅仅支持Windows操作系统平台的软件产品已经不能满足市场需求,跨平台的产品越来越受到人们的欢迎。GTK+是一套跨多种平台的图形工具包,能开发出满足跨平台要求的界面应用程序。GTK+工具包自带的界面库元素只能满足最基本的应用程序要求,要开发出更高级的界面应用程序,需要满足特定功能要求的自定义界面库控件。

1 GTK+简介

GTK(GIMP TookKit)是一套跨多种平台的图形工具包,是按照LGPL许可协议发布的。虽然最初是为GIMP而写的,但时至今日早已发展为一个功能强大、设计灵活的通用图形库,特别是被GNOME选中,使得GTK+被广泛应用,成为Linux下开发图形界面应用程序的主流开发工具之一。GTK+是一套开放源码的自由软件,这一点保证了它的信息安全性。

2 GTK+自定义控件设计和使用

当已有的界面库元素不能很好地满足开发者要求时,需要考虑编写自定义GTK+界面控件。

首先,分析该自定义控件需要满足的功能,定义头文件和实现文件。以自定义面板TestPanel为例,假设存在一个自定义面板,其中包含两个按钮button1和button2。另外给TestPanel定义一个回调函数pressed,应用程序绑定此回调函数。当点击button1或者button2时,都触发此回调函数。这就是TestPanel的功能定义。

参考gtkbutton的源码,我们应该定义TestPanel.h、TestPanel.c、TestPanelPrivate.h这三个文件。由于TestPanelPrivate.h文件只包含一个控件信息结构体,因此可考虑把TestPanelPrivate.h文件的内容合并到TestPanel.h中。在TestPanel.h中就包含TestPanel、TestPanelClass、private_data这三个结构体的定义,如图1所示。

TestPanel中的GtkVBox是该自定义控件的父控件,表示该自定义控件是基于工具包中的VBox之上的。Private_data参数就是结构体private_data对象,此处用指针表示。对应的TestPanelClass中包含一个GtkVBoxClass对象和pressed回调函数的声明。

然后从自定义控件的创建函数开始逐步分析实现过程。在创建函数TestPanel_new中,调用GTK+的相关方法获取自定义控件的类型信息,返回GtkType的对象。在获取类型信息的同时,调用了testPanel_class_init的初始化方法。根据这个GtkType对象,创建一个自定义控件的GtkWidget对象。接着初始化该自定义控件,包括在控件上添加两个按钮,并绑定按钮的点击事件。

接下来要定义回调函数。在自定义控件的实现文件中定义一个静态数组,为static guint testPanel??? signals[LAST SIGNAL]={0};,用来存储所有的回调命令。然后在testPanel_class_init方法中初始化回调命令,如图2所示,其中,object_class是把参数TestPanelClass*klass强转成GtkObjectClass*。

图2 初始化回调命令程序

接着定义在自定义控件内部何时触发此回调函数,调用gtk_signal_emit函数即可触发。在本例中,在button1和button2的clicked事件中触发pressed回调函数,程序为gtk_signal_emit(GTK_OBJECT(panel),testPanel_signals[PRESSED]);

最后,实现完自定义控件后,应用程序就像和使用基础类库的基本界面元素一样使用自定义控件。如图3所示,调用new方法来构造对象,调用gtk_signal_connect方法绑定回调函数,调用gtk_container_add把它添加到其他的GTK容器中。

图3 自定义控件使用程序

3 结束语

GTK+是在Linux环境下一套非常实用的工具界面库。同时,它也是一套完全开源的自由软件,对源码的研究有助于界面应用程序的开发,也能帮助我们更好地理解GTK+的设计思想和实现方法。参考源码实现,开发者们可以自定义一些适用于界面应用程序的界面控件。在实现自定义控件的过程中,可以按照自己的设计思想来实现,不需要照本宣科。当然,这需要我们在实践当中不断探索和学习。

参考文献

[1]战晓苏.Gtk+程序设计[M].北京:清华大学出版社,2002.

[2]博韦.深入理解LINUX内核[M].陈莉群,冯锐,牛欣源,译.北京:中国电力出版社,2008.

〔编辑:王霞〕

猜你喜欢
工具包
基于差异教学的数学课堂工具包开发与思考
澳大利亚:发布离校生工具包助青年就业
设计师与听障人士的沟通:以“旧物改造”为例
对现代校园中霸凌的概况综述与模式化解决工具包的设计
谷歌云与Digital Asset合作推出区块链工具包
“工具包”应该这样“打开”
全民阅读语境下公共图书馆阅读工具包发展策略
运用MATLAB软件求解高中数学中的线性和非线性规划问题
出一条新路子
职业安全卫生防护“工具包”应用