Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8299263
  • 博文数量: 1413
  • 博客积分: 11128
  • 博客等级: 上将
  • 技术积分: 14685
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-13 10:03
个人简介

follow my heart...

文章分类

全部博文(1413)

文章存档

2013年(1)

2012年(5)

2011年(45)

2010年(176)

2009年(148)

2008年(190)

2007年(293)

2006年(555)

分类: C/C++

2007-08-13 15:29:45

在 Glade 中使用自定义控件;Glade/libglade 的最佳用发。

Glade vs libglade

Glade 和 libglade 之简的关系和使用建议。
Glade
是一个图形界面的构建 GTK+/GNOME 程序界面的程序,她是所见即所得的,同 M$ 的 visual studio 中的界面设计工具类似。使用它你可以获得一个描述你界面的名为 xxx.glade 的 xml 文件,你也可以用它直接生成构建程序界面的 c/c++ 代码。
libglade
是一个用于 GTK+/GNOME 程序中的,从 xxx.glade 文件自动生成程序界面或界面中的一部分的库。

Glade 设计初衷就是要把 GTK+/GNOME 程序的界面描述从源代码里分离出来,即使用 xxx.glade 文件来描述界面,而不是把生成界面的 c 代码写再源代码中,额外的好处就是使得后期修改程序界面非常容易,你只需要使用 Glade 来调整界面即可(实际是仅仅修改了 xxx.glade 文件,无需对源程序做改动)。另外,使用 .glade 文件来生程序界面并不会影响到你的程序的效率,因为你只需要一次装入所有界面,然后在需要时直接使用。


因此,正确的使用 Glade 的方法是:采用 Glade 来生成你的程序界面的 .glade 文件,然后在你的源码中使用 libglade 提供的接口函数来生成你的界面,或界面中一部分。

技巧1
也许你并不需要使用 libglade 来生成你的整个程序界面,libglade 允许你这么做,你只需要在装载 .glade 时指定你需要的控件名即可。
技巧2
当你只需要 .glade 中的某一部分控件,而又想一次载入整个 .glade 文件时,你需要在使用 Glade 设计界面时把整个窗口设置为不可见,以免自动生成的界面显示出来,然后逐个的获取你需要的部分(glade_xml_get_widget(...))。
技巧3
通常你的应用程序里都需要一个或者更多交互式的对话框,比如首选项对话框,这时使用 .glade 来构建这些对话框就显得格外方便,按照技巧1,2 的方法就可方便的实现。
技巧4
对于需要额外控制的控件(比如实时改变其属性等),你应该给他取一个能顾名思义的名字,然后在你的源代码中定义成宏,在需要应用它时,再根据这些宏来获取控件; 或者,在装载 .glade 文件后,把所有这类控件查询出来,以后直接引用,一劳永逸。

简单的自定义控件

最简单的实现方法

Glade 参考手册 里的 扩展 Libglade 提到了集中扩展 Glade 的方法,本教程将用实例来演示其用法。

第一种方法就是使用 Glade 提供的 定制控件 ,这种方法允许我们在设计界面的时候,放入一个定制控件,并提供创建该控件的函数名,然后在程序中初始化界面时(glade_xml_signal_connect 中自动完成)使用指定的函数来创建相应的控件。这个函数定义如下:

    GtkWidget *custom_func(gchar *widget_name, gchar *string1, gchar *string2,
gint int1, gint int2);

具体实现:

添加定制控件

如下图所示:

1.png

在代码中实现创建函数

代码如下:

   #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

运行效果如下:

2.png

由于 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 3 特点介绍

Glade 3 是一个完全重写过的版本,最大的特点就是去掉了代码生成的功能。这也完全符合 Glade 的初衷:界面与代码的分离。原来的代码生成功能实际上误导了一部分人(这似乎不是功能本身的错),使得她们认为使用 Glade 来构件界面仍然十分困难(她们忽略了 libglade)。

Glade 3 还支持多个工程,撤销/重作,更加清晰的界面。XML 格式没有变化,所以你可以使用 Glade-2 和 Glade-3 来编辑同一个 .glade 文件。

Glade 3 还在开发当中,如自定义控件,Gnome, Gnome-db 等还未被支持。

获取 Glade 3
cvs -z3 -q -d:pserver:anonymous@anoncvs.gnome.org:/cvs/gnome co glade3
阅读(3627) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~