follow my heart...
分类: C/C++
2007-08-13 15:29:45
Glade 设计初衷就是要把 GTK+/GNOME 程序的界面描述从源代码里分离出来,即使用 xxx.glade 文件来描述界面,而不是把生成界面的 c 代码写再源代码中,额外的好处就是使得后期修改程序界面非常容易,你只需要使用 Glade 来调整界面即可(实际是仅仅修改了 xxx.glade 文件,无需对源程序做改动)。另外,使用 .glade 文件来生程序界面并不会影响到你的程序的效率,因为你只需要一次装入所有界面,然后在需要时直接使用。
因此,正确的使用 Glade 的方法是:采用 Glade 来生成你的程序界面的 .glade 文件,然后在你的源码中使用 libglade 提供的接口函数来生成你的界面,或界面中一部分。
在 Glade 参考手册 里的 扩展 Libglade 提到了集中扩展 Glade 的方法,本教程将用实例来演示其用法。
第一种方法就是使用 Glade 提供的 定制控件 ,这种方法允许我们在设计界面的时候,放入一个定制控件,并提供创建该控件的函数名,然后在程序中初始化界面时(glade_xml_signal_connect 中自动完成)使用指定的函数来创建相应的控件。这个函数定义如下:
GtkWidget *custom_func(gchar *widget_name, gchar *string1, gchar *string2,
gint int1, gint int2);
具体实现:
添加定制控件
如下图所示:
在代码中实现创建函数
代码如下:
#include
#include
#include
#define GLADE_FILE "./glade-custom-widget-demo.glade"
GtkWidget* custom_widget_create (gchar *widget_name, gchar *string1, gchar *string2,
gint int1, gint int2);
int main (int argc, char **argv)
{
GtkWidget *window;
GladeXML *xml;
gtk_init (&argc, &argv);
xml = glade_xml_new (GLADE_FILE, NULL, NULL);
glade_xml_signal_autoconnect (xml);
gtk_main ();
return 0;
}
GtkWidget* custom_widget_create (gchar *widget_name, gchar *string1, gchar *string2,
gint int1, gint int2)
{
GtkWidget *widget;
GtkWidget *box, *button;
box = gtk_vbox_new (FALSE, 4);
button = gtk_button_new_with_label(g_strdup_printf ("Name: %s", widget_name));
gtk_box_pack_start (GTK_BOX(box), button, FALSE, FALSE, 4);
widget = gtk_label_new (g_strdup_printf ("string1: %s", string1));
gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 4);
widget = gtk_label_new (g_strdup_printf ("string2: %s", string2));
gtk_box_pack_start (GTK_BOX(box), widget, FALSE, FALSE, 4);
/* This is very important */
gtk_widget_show_all (box);
return box;
}
注:这里的实现非常的简单,我只是在这个函数里创建了几个 GTK+ 自带的控件,你可以在这里创建你自定义的 GTK+ 控件。
源码包: 下载
使用:解压后执行 make && ./main
运行效果如下:
由于 glade 在生成界面中的自定义控件时要要调用相应的函数,所以,当你把实现函数放在不同的源码中时,你需要给 gcc 加上额外的链接参数: -rdynamic
,这样程序执行时才能着到对应的函数,如果没有加上这个参数,则 glade 会报告如下错误:
(main:23693): libglade-WARNING **: could not find widget creation function
如下的错误信息也是同样的原因:
(lt-totem:4575): libglade-WARNING **: could not find signal handler 'on_about1_activate'.
(lt-totem:4575): libglade-WARNING **: could not find signal handler 'on_preferences1_activate'.
因为链接后的程序找不到指定的函数地址。
我们把上面的代码拆分成 2 个源文件,然后在 Makefile 文件中添加 -rdynamic
,修改后的 Makefile 如下:
GLADE_ADD = -rdynamic
CFLAGS = $(shell pkg-config --cflags gtk+-2.0 libglade-2.0)
LDFLAGS = $(GLADE_ADD) $(shell pkg-config --libs gtk+-2.0 libglade-2.0)
main: main.o cw.o
.c.o:
$(CC) -g $(CFLAGS) -c $< -o $@
clean:
rm -f *.o main
代码: 源码2
Glade 3 是一个完全重写过的版本,最大的特点就是去掉了代码生成的功能。这也完全符合 Glade 的初衷:界面与代码的分离。原来的代码生成功能实际上误导了一部分人(这似乎不是功能本身的错),使得她们认为使用 Glade 来构件界面仍然十分困难(她们忽略了 libglade)。
Glade 3 还支持多个工程,撤销/重作,更加清晰的界面。XML 格式没有变化,所以你可以使用 Glade-2 和 Glade-3 来编辑同一个 .glade 文件。
Glade 3 还在开发当中,如自定义控件,Gnome, Gnome-db 等还未被支持。