gtk+blade+anjuta 的简单实例

gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04

1>  选择源

不正确会有很多问题,速度慢,找不到安装的软件。163的源就不错

http://mirrors.163.com/.help/ubuntu.html

如页面提示操作后,

apt-get install update ; apt-get install upgrade

2>  安装软件

apt-get install build-essential  #据说包含包含 一些基本工具,linux机器一般都具有

apt-get install gcc make gdb   #安装编译工具

apt-get install gnome-core-devel #真大啊,400M+,比较懒的做法,把gnome的开发核心一下子装上,gtk只是它 的子集

apt-get install devhelp    #帮助文档

apt-get install glade        #界面设计工具

apt-get install anjuta       #gta 最著名的IDE

3> 简单测试

c代码

#include

void hello(GtkWidget *widget,gpointer data)

{

g_print("Hello Ubuntu!\n");

}

gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)

{

g_print ("delete event occurred\n");

return(TRUE);

}

void destroy(GtkWidget *widget,gpointer data)

{

gtk_main_quit();

}

int main( int argc, char *argv[] )

{

GtkWidget *window;

GtkWidget *button;

gtk_init (&argc, &argv);

window=gtk_window_new (GTK_WINDOW_TOPLEVEL);

gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);

gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);

gtk_container_set_border_width (GTK_CONTAINER (window), 10);

button = gtk_button_new_with_label ("Hello Ubuntu!");

gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);

gtk_signal_connect_object (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (gtk_widget_destroy),GTK_OBJECT (window));

gtk_container_add (GTK_CONTAINER (window), button);

gtk_widget_show (button);

gtk_widget_show (window);   /*显示一个窗口*/

gtk_main();   /*进入主循环*/

return(0);

}

编译

gcc test.c -o gtktest `pkg-config --cflags --libs gtk+-2.0`

运行

./gtktest

测试成功

出现个gtktest为title的窗口,窗口中只有个“Hello Ubuntu!”的按钮

4> glade+gtk测试

glade 操作

打开glade,创建个工程,实际就是生成一个文件,默认是glade为扩展名的xml格式的文件

保存为test.glade

1: 添加个窗口

在“常规“(general)面板中设置窗口的属性

“名称”(name)中写入窗口ID,默认值为window1, 源码实例化时会用到

2: 触发gtk中的函数

在“信号”(signal)面板中设置触发

为简单起,只在窗口销毁时触发我们的函数,gtk销毁的信号是在GtkWidget中继承的,所以

在“GtkWidget”的树形结构中设置“处理函数”的值:

选中"destroy"信号,在“处理函数”列中设置值:on_windown1_destroy.  这个值其实就是在gtk中的源码中调用的

为做测试,在添加个,一个信号可以设置多个

选中"destroy"信号,在“处理函数”列中设置值:on_windown1_destroy_my

生成的文件: test.glade

window1">

False

w_title

on_window1_destroy" swapped="no"/>

on_window1_destroy_my" swapped="no"/>

3: c源码:test.c

#include

#define DBG(s) printf("%-30s %04d %s\n",__func__, __LINE__, (s))

void

on_window1_destroy (GtkObject *object, gpointer user_data)

{

DBG("------");

gtk_main_quit ();

}

void

on_window1_destroy_my (GtkObject *object, gpointer user_data)

{

DBG("------");

gtk_main_quit ();

}

int

main (int argc, char *argv[])

{

GtkBuilder      *builder;

GtkWidget       *window;

gtk_init (&argc, &argv);

builder = gtk_builder_new ();

gtk_builder_add_from_file (builder, "test.glade", NULL);

window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));

gtk_builder_connect_signals (builder, NULL);

g_object_unref (G_OBJECT (builder));

DBG("------");

gtk_widget_show (window);

DBG("------");

gtk_main ();

DBG("------");

return 0;

}

编译

gcc -Wall -g -o test test.c `pkg-config --cflags --libs gtk+-2.0` -export-dynamic

运行

./test

结果

出现窗口,点击关闭,窗口退出

终端显示

main                                         0033 ------

main                                         0036 ------

on_window1_destroy               0008 ------

on_window1_destroy_my        0014 ------

main                                         0039 ------

总结

glade生成xml。

c使用GtkBuilder生成个对象,builder。

builder通过检索xml中的 ”id“, 生成图形对象,

检索xml中的”handler“,关联到C中的函数

5> anjuta测试

启动anjuta -> 新建项目 -> 选择项目类型:”GTK+简单“  -> 基本信息:

默认项目名称,gtk-foobar,不更改

继续 -> 默认值,不更改,一直回到主界面。

执行

就会出现个空白窗口。

看看Anjuta为我们生成了什么

├── autom4te.cache

├── Debug

│   ├── po

│   └── src

├── po

└── src

源码文件:src/*

Debug生成的文件: Debug/*

其他的都是项目管理文件

最重要的是src文件

ls src

gtk_foobar.ui  main.c  Makefile.am  Makefile.in

c源码:main.c

cat src/main.c

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */

/*

* main.c

* Copyright (C) 2012 root

*

* gtk-foobar is free software: you can redistribute it and/or modify it

* under the terms of the GNU General Public License as published by the

* Free Software Foundation, either version 3 of the License, or

* (at your option) any later version.

*

* gtk-foobar is distributed in the hope that it will be useful, but

* WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

* See the GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License along

* with this program.  If not, see .

*/

#include

#include

#include

typedef struct _Private Private;

static struct _Private

{

/* ANJUTA: Widgets declaration for gtk_foobar.ui - DO NOT REMOVE */

};

static struct Private* priv = NULL;

/* For testing propose use the local (not installed) ui file */

/* #define UI_FILE PACKAGE_DATA_DIR"/ui/gtk_foobar.ui" */

#define UI_FILE "src/gtk_foobar.ui"

#define TOP_WINDOW "window"

/* Signal handlers */

/* Note: These may not be declared static because signal autoconnection

* only works with non-static methods

*/

/* Called when the window is closed */

void

destroy (GtkWidget *widget, gpointer data)

{

gtk_main_quit ();

}

static GtkWidget*

create_window (void)

{

GtkWidget *window;

GtkBuilder *builder;

GError* error = NULL;

/* Load UI from file */

builder = gtk_builder_new ();

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

{

g_critical ("Couldn‘t load builder file: %s", error->message);

g_error_free (error);

}

/* Auto-connect signal handlers */

gtk_builder_connect_signals (builder, NULL);

/* Get the window object from the ui file */

window = GTK_WIDGET (gtk_builder_get_object (builder, TOP_WINDOW));

if (!window)

{

g_critical ("Widget \"%s\" is missing in file %s.",

TOP_WINDOW,

UI_FILE);

}

priv = g_malloc (sizeof (struct _Private));

/* ANJUTA: Widgets initialization for gtk_foobar.ui - DO NOT REMOVE */

g_object_unref (builder);

return window;

}

int

main (int argc, char *argv[])

{

GtkWidget *window;

#ifdef ENABLE_NLS

bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);

bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");

textdomain (GETTEXT_PACKAGE);

#endif

gtk_init (&argc, &argv);

window = create_window ();

gtk_widget_show (window);

gtk_main ();

g_free (priv);

return 0;

}

ui源码文件:gtk_foobar.ui

window">

True

window

500

400

destroy"/>

我用不同的颜色标识他们的区别与联系

和上面我们自己用glade+gtk例子手动完成的几乎一样。

通过后面的几个测试,就对gtk的开发有个初步认识。

资源:

Micah 2007年 《GTK+ and Glade3 GUI Programming Tutorial》

http://www.micahcarrick.com/gtk-glade-tutorial-part-1.html

http://www.micahcarrick.com/gtk-glade-tutorial-part-2.html

http://www.micahcarrick.com/gtk-glade-tutorial-part-3.html

某热心人对上面的翻译

http://blog.csdn.net/xbwee/article/details/4032652

http://blog.csdn.net/xbwee/article/details/4032815

http://blog.csdn.net/xbwee/article/details/4034314

时间: 2024-10-24 06:39:39

gtk+blade+anjuta 的简单实例的相关文章

【MySQL】存储过程、游标、循环简单实例

有时候仅凭 sql 语句可能达不到想要的数据操作目的,有可能需要写一些方法体,通过循环判断等操作最终达到目的.那么在数据库里实现这种方法体就需要存储过程了,个人觉得一个带注释的简单实例可以简单粗暴地解决大部分问题,当然要深入学习了解的话还是要看教程文档了,话不多说,上码: [sql] view plain copy create procedure my_procedure() -- 创建存储过程 begin -- 开始存储过程 declare my_id varchar(32); -- 自定义

session 对象的简单实例

一个session对象的简单实例: 1.登录界面:使用简单的html表单提交界面. <%@ page language="java" contentType="text/html; charset=GB18030"    pageEncoding="GB18030"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "ht

javamail发送邮件的简单实例(转)

javamail发送邮件的简单实例 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接复制即可. 第一个类:MailSenderInfo.java package com.util.mail;    /**    * 发送邮件需要使用的基本信息  *author by wangfun http://www.5a520.cn 小说520   */  

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr

Spring+Struts 2 简单实例报空指针异常

空指针出现于Action注入位置..如果一般错误请检查配置文件. 我出的错误.在于拷贝了之前做的实例中的lib文件夹到这个工程中. 其中有个包为struts2-convention-plugin-2.3.16.3.jar 造成了包识别异常.出现空指针.有类似经历的可以查看,也给大家提个醒.不要一气呵成的导入所有包.容易出现混乱.也不利于大家清楚的认识包和代码的联系. Spring+Struts 2 简单实例报空指针异常,布布扣,bubuko.com

mvc area区域和异步表单,bootstrap简单实例

码农最怕眼高手低 今天来练习mvc Area技术和bootstrap以及异步表单的C#代码实现. 1.area区域架构对于建立复杂业务逻辑很有帮助,由  AreaRegistration.RegisterAllAreas()方法遍历路由表,获得所有注册的路由.参见 建立类库Common,下设一个文件夹BookStore 在其中建立model和controller.(注意引用System.Web.Mvc这个dll) 项目结构如图: 其中book.cs为model模型 namespace Commo

DataGridView重绘painting简单实例

private void dataGridViewX1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.RowIndex >= 0 && e.ColumnIndex>=0) { Rectangle newRect = new Rectangle(e.CellBounds.X, e.CellBounds.Y, e.CellBounds.Width - 1, e.CellBounds.

jQuery Datatable 实用简单实例

目标: 使用jQuery Datatable构造数据列表,并且增加或者隐藏相应的列,已达到数据显示要求.同时,jQuery Datatable强大的功能支持:排序,分页,搜索等. Query Datatable能良好支持数据完全加载到本地后构建数据列表,排序.分页.搜索等功能就会自带,不需要我们去关心,在此主要说明通过后台动态的加载数据,已达到在大数据面前提高效率的效果. 1. 通过后台进行分页 2. 通过后台进行排序 3. 通过后台进行搜索 具体使用方法: 1. 首先构建我们需要的数据列表,以

Hadoop初学指南(6)--MapReduce的简单实例及分析

本文在上一节的基础上通过一个简单的MR示例对MapReduce的运行流程进行分析. 假设有两行数据,分别是hello you,hello me,我们要统计其中出现的单词以及每个单词出现的次数. 所得的结果为 hello   2 you     1 me      1 (1)大致运行流畅 1.解析成2个<k,v>,分别是<0, hello you><10, hello me>.调用2次map函数. 2.执行map任务 3.map输出后的数据是:<hello,1>