gtk+:是一套源码以LGPL许可协议分发、跨平台的图形工具包
glade:是gtk+图形用户界面产生器(Graphical User Interface Builder for GTK+)
有关gtk的资料着实不多,之前通过各种努力,终于把gtk移植到开发板上了,现在发现gtk的画UI的IDE就是glade。然而glade在不同的gtk版本上接口不同,其中gtk2.12前的版本采用libglade库来支持,之后的版本和gtk库绑定在一起,不用单独移植,参看下表。本文将介绍两种方式的使用极其相关移植。
libglade | GtkBuilder |
---|---|
#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源码编辑如下:
3>Makefile如下:/* ************************************************************************ * 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; }
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
注意在编译时,出现下列情况:
解决版本,修改:/opt/gtkdfb/include/glib-2.0/glib/gutils.h.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'
注释掉重复定义的部分,例如:
//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了,祝愉快!