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

 
1>  选择源
不正确会有很多问题,速度慢,找不到安装的软件。163的源就不错
如页面提示操作后,
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》
某热心人对上面的翻译

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

  1. laravel5.1框架基础之Blade模板继承简单使用方法分析

    本文实例讲述了laravel5.1框架基础之Blade模板继承简单使用方法.分享给大家供大家参考,具体如下: 模板继承什么用? 自然是增强基础页面的复用,有利于页面文档的条理,也便于更改多处使用的内容 ...

  2. Hibernate(二)__简单实例入门

    首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...

  3. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...

  4. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  5. 利用navicat创建存储过程、触发器和使用游标的简单实例

    利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报  分类: 数 ...

  6. 【转】Android Https服务器端和客户端简单实例

    转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.7 ...

  7. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  8. vue路由的简单实例

    vue2.0 和 vue1.0 路由的语法还是有点稍微的差别,下面介绍一下vue-router 2的简单实例: <!DOCTYPE html> <html lang="en ...

  9. Flume概述和简单实例

    Flume概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方( ...

随机推荐

  1. Docker学习笔记(3) — docker仓库的镜像怎么删除

    docker越来越炙手可热,如果你的团队已经准备开始使用docker,那么私有仓库是必不可少的东西,首先是可以帮助你加快从服务器pull镜像的速度,其次也可以帮助你存放私有的镜像,本文主要为大家介绍如 ...

  2. 用PowerMockito来mock私有方法(转)

    话说我们做的所谓的接口测试真的是不伦不类啊,测的是controller层,那叫接口木??!!可是老大们说写的是接口测试,那就接口吧! 自接手写这个接口测试不久,很多人,包括一个关系比较好的架构师就跟我 ...

  3. Creating Spatial Indexes(mysql 创建空间索引 The used table type doesn't support SPATIAL indexes)

    For MyISAM tables, MySQL can create spatial indexes using syntax similar to that for creating regula ...

  4. 怎样实现cocos2d-x之文字渲染

    // 1.创建一段文本 // create函数的三个参数分别为:文本内容.字体和字体大小 CCLabelTTF *font=CCLabelTTF::create("Hello World&q ...

  5. [zencart教程]zencart外贸建站仿站交流俱乐部

    [zencart教程]zencart外贸建站仿站交流俱乐部 1.你想自主一天仿做一个精美的zencart 外贸网站; 2.你想自已自主定制精美的psd 图 zencart模板,并把它变成自定义精美 z ...

  6. Windows下sass的安装

    sass依赖Ruby,所以,首先得先安装个Ruby 安装步骤: 1.安装Ruby的时候,勾上Add Ruby executables to your PATH(添加环境变量) 2.安装好Ruby之后, ...

  7. C#面向对象2 静态类、静态成员的理解

    理解:静态成员属于类所有,为各个类的实例所公用,与实例无关,需要全局共享的属性或者方法定义成静态的 C#静态成员:  1.静态成员属于类所有,故用类名调用,非静态成员属于类的实例所有,用实例名调用  ...

  8. Java基础05 实施接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部 ...

  9. Moss、SharePoint数据库迁移问题(转)

    当项目快做完时,大家都要考虑将程序及数据迁移到正式环境部署.但是,如果用SharePoint开发,它会产生很多数据库,到底哪些需要迁移,哪些不需要迁移了?? 请看: 1.配置完成SharePoint后 ...

  10. MVC简单分页

    对Car汽车表分页 实现简单分页,放在这里方便查看回顾,自定义每页几条有点问题,有待完善······ 1.新建mvc项目 2.添加linq to sql 数据库连接 3.添加CarBF类 using ...