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了,祝愉快!







<think>嗯,用户想知道在Linux上用C语言如何实现可视化。我得想想有哪些方法可以介绍给他。首先,可能得提到图形库,比如GTK或者Qt,不过Qt主要是C++的,但C的话可能可以用,不过可能不太方便。然后还有SDL,适合游戏和多媒体应用。OpenGL或者Vulkan的话,适合需要3D渲染的情况。 另外,可能有些简单的图形库,像Cairo或者Xlib,直接和X Window系统交互。不过Xlib比较底层,可能对新手不太友好。还有ImGUI这种即时模式的图形库,可能适合需要快速开发的情况。 另外,如果用户只是想绘图,可能可以用像Matplotlib这样的库,但那是Python的,不过C语言可能需要其他方式,比如生成数据后用gnuplot调用。或者使用SVG或者位图生成图像文件。 用户可能需要根据项目需求选择不同的方法。比如,如果是做图形界面应用,GTK可能更合适;如果是游戏,SDL或OpenGL更好;简单的绘图可以用Cairo或者直接生成图像文件。 可能还需要考虑安装和编译这些库的依赖,比如如何安装GTK的开发包,编译时链接哪些库。比如用gcc编译时要加`pkg-config --cflags --libs gtk+-3.0`之类的。 另外,可能需要给出一个简单的例子,比如用GTK创建一个窗口,或者用SDL画一个矩形,这样用户能更直观地理解。例如,GTK的示例代码,初始化窗口,添加画布,处理绘制事件。 还要提醒用户,不同的方法有不同的学习曲线和适用场景,需要根据具体需求选择。比如,如果只是需要显示图表,可能Cairo比较合适;如果是复杂的界面GTK或Qt更好,虽然Qt主要是C++,但C也可以绑定。 可能用户对C语言在Linux下的可视化不太熟悉,所以需要分点说明,每个方法的优缺点,适用场景,以及简单示例。这样用户可以根据自己的项目需求选择最合适的方式。</think>在 Linux 上实现 C 语言代码的可视化,可以通过多种方式实现。以下是常见的几种方法及其简要说明和示例: --- ### 一、图形界面库(GUI 工具包) #### 1. **GTK (GIMP Toolkit)** - **特点**:开源跨平台,适合创建桌面应用程序,提供按钮、窗口等控件。 - **示例代码**(显示一个窗口): ```c #include <gtk/gtk.h> int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GTK Demo"); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` - **编译**:`gcc demo.c -o demo $(pkg-config --cflags --libs gtk+-3.0)` #### 2. **SDL (Simple DirectMedia Layer)** - **特点**:适合游戏/多媒体开发,支持2D渲染、音频、输入事件等。 - **示例代码**(绘制一个红色矩形): ```c #include <SDL2/SDL.h> int main() { SDL_Init(SDL_INIT_VIDEO); SDL_Window *window = SDL_CreateWindow("SDL Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0); SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 红色 SDL_Rect rect = {100, 100, 200, 150}; SDL_RenderFillRect(renderer, &rect); SDL_RenderPresent(renderer); SDL_Delay(3000); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` - **编译**:`gcc demo.c -o demo -lSDL2` --- ### 二、图形渲染库 #### 1. **Cairo** - **特点**:矢量图形库,支持生成 PNG、PDF 等格式,适合绘制图表。 - **示例代码**(绘制圆形): ```c #include <cairo/cairo.h> int main() { cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 400, 300); cairo_t *cr = cairo_create(surface); cairo_set_source_rgb(cr, 0, 0, 0); // 黑色背景 cairo_paint(cr); cairo_set_source_rgb(cr, 1, 0, 0); // 红色圆形 cairo_arc(cr, 200, 150, 50, 0, 2 * M_PI); cairo_fill(cr); cairo_surface_write_to_png(surface, "output.png"); cairo_destroy(cr); cairo_surface_destroy(surface); return 0; } ``` - **编译**:`gcc demo.c -o demo -lcairo` #### 2. **OpenGL** - **特点**:跨平台 3D 图形接口,需结合 GLFW 或 GLUT 管理窗口。 - **示例代码**(需安装 `glfw` 和 `glad`): ```c #include <GLFW/glfw3.h> int main() { glfwInit(); GLFWwindow *window = glfwCreateWindow(640, 480, "OpenGL Demo", NULL, NULL); glfwMakeContextCurrent(window); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; } ``` - **编译**:`gcc demo.c -o demo -lglfw -lGL` --- ### 三、终端可视化 #### 1. **NCurses** - **特点**:在终端中创建文本界面(如菜单、进度条)。 - **示例代码**: ```c #include <ncurses.h> int main() { initscr(); printw("Hello NCurses!"); refresh(); getch(); endwin(); return 0; } ``` - **编译**:`gcc demo.c -o demo -lncurses` #### 2. **生成图像文件** - 使用 `libpng` 生成 PNG 文件,或通过 `gnuplot` 调用外部绘图工具。 --- ### 四、Web 可视化 - **通过 Web 服务器**:用 C 生成 HTML/CSS/JS 或 WebSocket 数据,通过浏览器展示。 --- ### **选择建议** - **简单界面**:GTK 或 NCurses - **游戏/动画**:SDL 或 OpenGL - **数据图表**:Cairo 或生成 CSV 后调用外部工具(如 gnuplot) - **快速原型**:结合 Python 的 C 扩展(如通过 C 生成数据,用 Matplotlib 绘图) 根据需求选择合适的工具,安装对应开发库后编译运行即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值