Personal tools
You are here: Home 文档中心 教程 Glade 高级教程 简单的自定义控件
Document Actions

简单的自定义控件

最简单的实现方法

yangh

在 Glade 中使用自定义控件;Glade/libglade 的最佳用发。
Page 2 of 3.

在 "Glade 参考手册":http://www.gnome-cn.org/documents/developer_doc/API/libglade/ 里的 "扩展 Libglade":http://www.gnome-cn.org/documents/developer_doc/API/libglade/libglade-extending.html 提到了集中扩展 Glade 的方法,本教程将用实例来演示其用法。

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

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

具体实现:

添加**定制控件**

如下图所示:

1.png

在代码中实现创建函数

代码如下:

   #include <stdio.h>

   #include <gtk/gtk.h>
   #include <glade/glade.h>

   #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+ 控件。

源码包: "下载":glade-custom-widget-demo.tar.gz

使用:解压后执行 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-custom-widget-demo-2.tar.gz

 
by yangh last modified Aug 25, 2005 04:24 AM