gtk中使用glade


gtk+:是一套源码以LGPL许可协议分发、跨平台的图形工具包

glade:是gtk+图形用户界面产生器(Graphical User Interface Builder for GTK+)

有关gtk的资料着实不多,之前通过各种努力,终于把gtk移植到开发板上了,现在发现gtk的画UI的IDE就是glade。然而glade在不同的gtk版本上接口不同,其中gtk2.12前的版本采用libglade库来支持,之后的版本和gtk库绑定在一起,不用单独移植,参看下表。本文将介绍两种方式的使用极其相关移植。

libglade && GtkBuilder
libgladeGtkBuilder
#include <glade/glade.h>
GladeXML*GTKBuilder*
glade_xml_new(FILE , "first_widget", NULL)

GError *error = NULL;

GtkBuilder *builder = gtk_builder_new();

if(!gtk_builder_add_from_file(builder, FILE, &error))

{

g_warning("cannot load builder file:%s", error->message);

}

glade_xml_get_widget(gxml, "widget_name")GTK_WIDGET(gtk_builder_get_object(builder, "widget_name"))
glade_get_widget_name(widget)gtk_widget_get_name(widget)

一、如果你采用的gtk2.12之后的版本,那么主要工作在于移植gtk,移植好了后,通过GtkBuilder这个对象来访问实现glade画的UI,我使用的是windows版本的glade3.6.7,支持libglade和GtkBuilder两种模式,

1>glade画UI,如下图:



注意:如果采用GtkBuilder,需要保存为GtkBuilder形式,如下图所示:


2>c源码编辑如下:

 
/* ************************************************************************
 *       Filename:  gtk_builder.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2013年12月30日 15时01分58秒
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:  YOUR NAME (), 
 *        Company:  
 * ************************************************************************/


#include <gtk/gtk.h>

void on_click_button(GtkButton *button, gpointer data)
{
        g_print("欢迎来到凌阳教育!\n");
}

int main(int argc, char *argv[])
{
        gtk_init(&argc, &argv);

        GtkWidget *window = NULL, *button = NULL;
        GtkBuilder *builder = gtk_builder_new();
        if(!gtk_builder_add_from_file(builder, "./gtk_builder.glade", NULL))
                g_print("cannot load file!");

        window = GTK_WIDGET(gtk_builder_get_object (builder, "window1"));
        button = GTK_WIDGET(gtk_builder_get_object (builder, "button1"));
        
        g_signal_connect(button, "clicked", on_click_button, NULL);
        
        gtk_widget_show_all(window);

        gtk_main();

        return 0;
}

3>Makefile如下:

SRC := #
SRC += gtk_builder.c

#OBJ := $(subst .c,.o,$(SRC))
OBJ = $(SRC:%.c=%.o)

PREFIX = /usr/local/arm/gtk_dfb/
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
LDFLAGS=-L${PREFIX}/lib -Wl,-rpath,${PREFIX}/lib 
CFLAGS=-I${PREFIX}/include/gtk-2.0/

CC = arm-linux-gcc
FLAGS = -Wall $(LDFLAGS) $(CFLAGS) `pkg-config --cflags --libs gtk+-2.0`
OPTION = -lpthread -ldl -lgthread-2.0
EXEC_NAME = demo
EXEC_PATH = ./

.PHONY:clean demo

demo:$(OBJ)
        @echo make ...
        $(CC) $^ -o $(EXEC_PATH)/$(EXEC_NAME) $(FLAGS) $(OPTION)
        @echo make over
        @echo Execute target is $(EXEC_PATH)/$(EXEC_NAME)
$(OBJ):%.o:%.c
        $(CC) -c -o $@ $< $(FLAGS)
clean:
        @echo clean ...
        rm $(EXEC_PATH)/$(EXEC_NAME) *.o -rf
        @echo clean over


二、如果采用gtk2.12之前的版本,移植gtk后还需要移植libglade,libglade的下载网址为:http://ftp.gnome.org/pub/gnome/sources/libglade/,我的gtk移植的是2.10,libglade采用的是2.6.4,移植时,三部曲:

./configure;make;make install:详细如下:

1>../configure

export PREFIX=/opt/gtkdfb

export LDFLAGS=-L$PREFIX/lib
export CFLAGS="-g -I$PREFIX/include"
export PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig

/opt/gtkdfb为我之前移植的gtk路径

./configure --host=arm-linux --prefix=$PREFIX --cache-file=arm-linux.cache --enable-inputapi=no

2>make

注意在编译时,出现下列情况:

.libs/glade-xml.o: In function `g_bit_nth_lsf':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:277: multiple definition of `g_bit_nth_lsf'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:277: first defined here
.libs/glade-xml.o: In function `g_bit_nth_msf':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:291: multiple definition of `g_bit_nth_msf'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:291: first defined here
.libs/glade-xml.o: In function `g_bit_storage':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:304: multiple definition of `g_bit_storage'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:304: first defined here
.libs/glade-xml.o: In function `g_trash_stack_push':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:322: multiple definition of `g_trash_stack_push'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:322: first defined here
.libs/glade-xml.o: In function `g_trash_stack_pop':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:330: multiple definition of `g_trash_stack_pop'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:330: first defined here
.libs/glade-xml.o: In function `g_trash_stack_peek':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:347: multiple definition of `g_trash_stack_peek'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:347: first defined here
.libs/glade-xml.o: In function `g_trash_stack_height':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:356: multiple definition of `g_trash_stack_height'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:356: first defined here
.libs/glade-parser.o: In function `g_bit_nth_lsf':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:277: multiple definition of `g_bit_nth_lsf'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:277: first defined here
.libs/glade-parser.o: In function `g_bit_nth_msf':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:291: multiple definition of `g_bit_nth_msf'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:291: first defined here
.libs/glade-parser.o: In function `g_bit_storage':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:304: multiple definition of `g_bit_storage'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:304: first defined here
.libs/glade-parser.o: In function `g_trash_stack_push':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:322: multiple definition of `g_trash_stack_push'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:322: first defined here
.libs/glade-parser.o: In function `g_trash_stack_pop':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:330: multiple definition of `g_trash_stack_pop'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:330: first defined here
.libs/glade-parser.o: In function `g_trash_stack_peek':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:347: multiple definition of `g_trash_stack_peek'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:347: first defined here
.libs/glade-parser.o: In function `g_trash_stack_height':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:356: multiple definition of `g_trash_stack_height'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:356: first defined here
.libs/glade-gtk.o: In function `g_bit_nth_lsf':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:277: multiple definition of `g_bit_nth_lsf'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:277: first defined here
.libs/glade-gtk.o: In function `g_bit_nth_msf':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:291: multiple definition of `g_bit_nth_msf'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:291: first defined here
.libs/glade-gtk.o: In function `g_bit_storage':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:304: multiple definition of `g_bit_storage'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:304: first defined here
.libs/glade-gtk.o: In function `g_trash_stack_push':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:322: multiple definition of `g_trash_stack_push'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:322: first defined here
.libs/glade-gtk.o: In function `g_trash_stack_pop':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:330: multiple definition of `g_trash_stack_pop'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:330: first defined here
.libs/glade-gtk.o: In function `g_trash_stack_peek':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:347: multiple definition of `g_trash_stack_peek'
.libs/glade-init.o:/opt/gtkdfb/include/glib-2.0/glib/gutils.h:347: first defined here
.libs/glade-gtk.o: In function `g_trash_stack_height':
/opt/gtkdfb/include/glib-2.0/glib/gutils.h:356: multiple definition of `g_trash_stack_height'


解决版本,修改:/opt/gtkdfb/include/glib-2.0/glib/gutils.h

注释掉重复定义的部分,例如:

 //G_INLINE_FUNC void    g_trash_stack_push  (GTrashStack **stack_p,
267 //                       gpointer      data_p);
268 //G_INLINE_FUNC gpointer    g_trash_stack_pop   (GTrashStack **stack_p);
269 //G_INLINE_FUNC gpointer    g_trash_stack_peek  (GTrashStack **stack_p);
270 //G_INLINE_FUNC guint   g_trash_stack_height    (GTrashStack **stack_p);
修改完了后,make clean,再make,编译通过
3>make install
完成库的安装,安装路径为/opt/gtkdfb/lib
 
 
使用: 

1>glade画UI,注意保存为libglade格式,如下图:


2>c代码如下:

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

void on_click_button(GtkButton* button,gpointer data)
{
        g_print("欢迎来到凌阳教育!\n");
} 

int main(int argc,char **argv)
{
        //下面这东西和上段代码的GtkBuilder等效
        GladeXML *gxml;
        GtkWidget *window = NULL, *button = NULL;
        gtk_init(&argc,&argv);

        //下面开始通过文件获取布局信息了
        gxml=glade_xml_new("libglade.glade",NULL,NULL);
        //信号连接
        glade_xml_signal_autoconnect(gxml);

        //获取构件
        window=glade_xml_get_widget(gxml,"window1"); /* window1 是glade3 中窗口的名字*/
        button = glade_xml_get_widget(gxml,"button1");
        
        g_signal_connect(button, "clicked", on_click_button, NULL);
        
        gtk_widget_show(window);  
        gtk_main(); 
        return 0;   
} 


3>Makefile入下:注意,需要制定移植的libglade库,在选项中添加`pkg-config --cflags --libs libglade-2.0`

SRC := #
SRC += libglade.c

#OBJ := $(subst .c,.o,$(SRC))
OBJ = $(SRC:%.c=%.o)

PREFIX = /opt/gtkdfb
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
LDFLAGS=-L${PREFIX}/lib -Wl,-rpath,${PREFIX}/lib 
CFLAGS=-I${PREFIX}/include/gtk-2.0/

CC = arm-linux-gcc
FLAGS = -Wall $(LDFLAGS) $(CFLAGS) `pkg-config --cflags --libs gtk+-2.0` `pkg-config --cflags --libs libglade-2.0`
OPTION = -lpthread -ldl -lgthread-2.0
EXEC_NAME = demo
EXEC_PATH = ./

.PHONY:clean demo

demo:$(OBJ)
        @echo make ...
        $(CC) $^ -o $(EXEC_PATH)/$(EXEC_NAME) $(FLAGS) $(OPTION)
        @echo make over
        @echo Execute target is $(EXEC_PATH)/$(EXEC_NAME)
$(OBJ):%.o:%.c
        $(CC) -c -o $@ $< $(FLAGS)
clean:
        pkg-config --modversion gtk+-2.0
        @echo clean ...
        rm $(EXEC_PATH)/$(EXEC_NAME) *.o -rf
        @echo clean over


总之,不论采用哪种方式,你都可以轻松享受,UI和程序分类的gtk了,祝愉快!







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值