分享
 
 
 

使用Glade和libGlade设计Gtk+图形界面

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

张威、曹剑

Gnome下已开发出了Glade这一应用软件,它是传统界面设计工具Gtk/Gdk的扩展,能满足基于Gtk+库的图形用户界面可视化开发的基本需求。

一、Glade简介

如果有一种软件能将图形界面的设计及时地展现于开发人员的面前,而且在设计完后能直接看到界面的外观效果,这样就使程序员的主要精力集中于应用程序核心功能的开发上,这就是所谓的可视化编程思想。

在Windows环境下,这种可视化的集成开发环境已有许多成熟的产品,如VC++、VB、PB、Delphi、C++Bulider等。基于Linux 操作系统的软件并不丰富,但绝非一片空白,例如Borland公司推出的Kylix。目前Gnome下已开发出了Glade这一应用软件,它是传统界面设计工具Gtk/Gdk的扩展,能满足基于Gtk+库的图形用户界面可视化开发的基本需求。

Glade可为你生成界面代码,基本过程如下:

1.让Glade设计出界面元素,设置界面元素属性,为构件的信号设置回调函数;

2.将其存为XML格式,观察并修改不符合要求的部分;

3.编写应用其它部分代码,并在应用中载入Glade文件,编译C代码生成执行文件。

这种模式使设计界面与其它部分代码完全分开,并且有可能做到在对界面进行改动后不必对应用进行编译。图形用户界面设计小组可不必关心应用程序的运行细节,同时编程人员也可以把他们的时间用于其它方面,而不需为界面的修改重复编写大量烦琐的Gtk+函数。这种分工开发的形式符合软件工程的要求,对GUI软件的开发也更方便。

二、使用Glade的预备条件

在学习使用Glade之前,我们假设你已对Linux操作系统的基本运用有初步了解、熟悉rpm包或gzip包的处理命令、对C语言有一定的了解,并熟悉消息处理编程机制。以上基础是使用Glade的必备知识,如果读者在以上某些方面尚存不明之处可先查阅相关资料。为了能更灵活地使用Glade开发应用,用户最好能熟悉gcc编译器,掌握make文件的编写规则。

我们再来看看如何使Glade加入到Linux操作系统的开发环境中,主要分两步:

1.获得Glade的源代码

你可以在大多数Linux操作系统的发布中找到Glade的源代码,也可从网上下载,目前能方便获得源代码的网站是www.Glade.pn.org,下载的文件可能是rpm或zip格式。

2.解压、编译并安装Glade

在获得源代码后,对压缩包解压缩,然后再运行make编译Glade。

三、设计界面

在对Glade有了初步的了解之后,让我们来看一看它的真面目吧,在Linux上先运行Xwindow,调出图形化界面后,你可以在虚拟控制台上输入Glade或在命令选单上找到开发子选单下的Glade项,点击即可。

调出Glade后,我们一般能看到三个窗口(如图1):一个工程管理窗口(主窗口)、一个常用构件窗口和一个属性管理窗口。这三个窗口构成了一个GUI的开发环境,对于使用过可视化编程的用户而言,这三个窗口应是很熟悉的。

工程管理窗口主要负责对一个工程项目的管理,我们所说的工程项目就是指所设计的图形界面。这个窗口中使用最多的是它的选单,常用的选单是创建新的工程项目,打开一个已有的项目文件进行编辑修改,以及改变对项目的视角等。

图1

常用构件窗口则是由Glade提供的常用Gtk+构件的图形化集。在需要调用某构件时只需在这个窗口中点击该构件的图标,然后在设计好的位置单击鼠标,这时构件就被安排到适当的位置。

属性窗口主要负责对项目对象的属性调整,它本身是一个分页式的notebook构件,在各页上集中了项目对象(构件)某个方面的属性,如构件的标题名称、尺寸大小、位置、停靠对齐方式、快捷键设置和信号处理等。

值得一提的是有些构件是根构件,或者说是顶层容器构件(如顶层窗口构件,对话框构件等),每一个顶层容器构件都会出现在工程管理窗口的主区内,顶层容器之间是独立的,要使它们能产生连接调度关系还需对由Glade生成的源码进行少量编辑。一个顶层构件的所有子孙构件由Glade维护在一个构件树中,我们可以调用工程管理窗口中的“查看构件树”选单项浏览构件树。

四、生成代码选项

当我们设计出想要的界面后就要让Glade生成我们需要的代码,点击build按钮,Glade会弹出一个选项窗口,这个窗口中有三页,分别是普通选项、C语言选项和libGlade选项(如图2)。

图2

五、Glade生成的文件

Glade 生成的主要目录及代码文件有如下几个:在项目的根目录(假设为/root/projects/project1)下有三个子目录/po、/src和/macros,程序源代码都放在/src目录中,这个目录下的文件可以用文本编辑器再修改以增加应用。

六、运用XML指针建立构件

libGlade在程序运行时才根据XML文档 (.Glade文件)构造构件,为了应用libGlade,我们在程序的开始要对Gnome和libGlade进行初始化。初始程序如下:

/初始化 gnome /

gnome_init("phonebook", VERSION, argc, argv);

/ 初始化libGlade /

Glade_gnome_init();

获得一个构件指针的代码如下:

/声明指针/

GladeXML xml;

GtkWidget dialog1;

/在由Glade软件生成的XML界面文件中找到名为“about1”的根构件,生成XML构件并将构件指针赋给 xml /

xml = Glade_xml_new("phonebook.Glade", "about1");

dialog = Glade_xml_get_widget(xml, "dialog1");

/对不用的指针要及时释放/

gtk_object_unref(GTK_OBJECT(xml));

设计界面时往往有相对独立的构件,在建造应用工程时要在这些构件之间建立联系,如主窗口和对话框的父子关系等,步骤如下:

1.用XML建立两个构件:

dialog = Glade_xml_get_widget(xml, "dialog1");

app= Glade_xml_get_widget(xml, "app1");

2.用gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app))函数将对话框设定为app窗口的从属构件。

注意:在用Glade设计界面时有一点需要注意的是所有的构件名不能重名,因为我们要以它们的名字对该构件进行访问。

七、消息处理函数

对于消息处理函数,我们可以在设计构件时就在构件的属性管理窗口中的signal页指明(如图3),Glade在生成的代码中自动加入函数名。如果用libGlade则有两点限制:

1. 回呼函数接收的参数不能指定类型而只能用空指针类型gpointer(void);

图3

2. 因为libGlade是在运行时才调用回呼函数,所以这类函数不能设为 static型。

八、实例代码

以下是用Glade生成的一个示例程序,它是一个简单的电话薄程序,共有三个用Glade设计的独立构件,一个主窗口、一个录入对话框和一个用于展示录入内容的clist列表构件。

我们可以从主窗口点击按钮弹出对话框,在对话框中有两个录入条,分别用于录入人名和电话号码,当点击对话框中的“确定”之后,人名和电话号码会加入到clist列表中,对话框关闭。有兴趣的读者可以对这个应用程序加以丰富。

#include 〈string.h〉

#include 〈gnome.h〉

#include 〈Glade/Glade.h〉

#define VERSION "1.0"

static GtkWidget app;

static GtkWidget clist;

void do_nothing(GtkWidget w);

void run_about_dialog(GtkWidget w);

void add_number(GtkWidget w);

void do_nothing(GtkWidget w){

gnome_app_message(GNOME_APP(app), "Doesn't do anything!");

}

void run_about_dialog(GtkWidget w){

GladeXML xml;

xml = Glade_xml_new("phonebook.Glade", "about1");

if(!xml) {

g_warning("We could not load the interface!");

return;

}

gtk_object_unref(GTK_OBJECT(xml));

}

static void

really_add_number(GtkWidget w, int button, gpointer data){

char strings[2];

GtkWidget name_entry;

GtkWidget phone_entry;

GladeXML xml = data;

if (button != 0)

return;

name_entry = Glade_xml_get_widget(xml, "add_name_entry");

phone_entry = Glade_xml_get_widget(xml, "add_phone_entry");

strings[0] = gtk_entry_get_text(GTK_ENTRY(name_entry));

strings[1] = gtk_entry_get_text(GTK_ENTRY(phone_entry));

gtk_clist_append(GTK_CLIST(clist), strings);

}

void add_number(GtkWidget w){

GtkWidget dialog;

GladeXML xml;

xml = Glade_xml_new("phonebook.Glade", "dialog1");

if(!xml) {

g_warning("We could not load the interface!");

return;

}

dialog = Glade_xml_get_widget(xml, "dialog1");

gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app));

gtk_signal_connect_full(GTK_OBJECT(dialog),"clicked",GTK_SIGNAL_FUNC (really

add_number), NULL, xml,(GtkDestroyNotify)gtk_object_unref,FALSE, FALSE);

}

int main(int argc, char argv[]){

GladeXML xml;

gnome_init("phonebook", VERSION, argc, argv);

Glade_gnome_init();

xml = Glade_xml_new("phonebook.Glade", "app1");

if(!xml) {

g_warning("We could not load the interface!");

return 1;

}

app=Glade_xml_get_widget(xml,"app1");

clist=Glade_xml_get_widget(xml,"clist1");

Glade_xml_signal_autoconnect(xml);

gtk_object_unref(GTK_OBJECT(xml));

gtk_main();

return 0;

}

对于使用过或熟悉Gtk+的读者来说,这样的代码就是以前我们要花大量时间和精力来编写的。有了这些代码,我们只要稍作修改就能完成所需的应用界面。

九、代码的编译与执行

Glade生成所需的代码后最后一步就是生成可执行文件了。

1.编译代码的条件

系统中必须安装automake 1.4和autoconf 2.13以上版本的两个软件,一般来说操作系统在安装时已将这两个软件安装好了,如要获得这两个软件可以到www.rawhide.redhat.com/pub/rawhide/i386/

redhat/rpms/下载。

2.编译代码的步骤

#〉./autogen.sh

在项目根目录下有一个autogen.sh文件, 它是一个shell脚本文件,运行这个脚本文件就能生成标准的 makefile文件。

#〉make

运行make 命令按makefile进行编译。

(1)#〉make install

运行install使某些资源如图片等安装到程序中,如果没有这一步程序也能运行,但当资源文件的路径有变化时,程序就会因找不到资源文件而出现问题。

(2)已生成的可执行文件放在/src子目录下,在该目录下运行该程序名即可。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有