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. python几个特别函数map filter reduce lambda

    lambda函数也叫匿名函数,即,函数没有具体的名称.先来看一个最简单例子: def f(x): return x**2 print f(4) Python中使用lambda的话,写成这样 g = l ...

  2. 一些Xcode 5的使用提示和技巧

    摘自:http://www.cocoachina.com/newbie/env/2014/0127/7766.html 感谢论坛成员郭亚鑫的热心翻译.   在iOS开发中,Xcode 是最使用最多的I ...

  3. HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

    lca的做法还是非常明显的.简单粗暴, 只是不是正解.假设树是长链就会跪,直接变成O(n).. 最后跑的也挺快,出题人还是挺阳光的.. 动态树的解法也是听别人说能ac的.预计就是放在splay上剖分一 ...

  4. android Gallery滑动不流畅的解决

    import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; impo ...

  5. c语言,数组和字符串

    1. “数组名代表了数组的存储首地址,是一个地址常量”. 对于char *p1 = "A String."; 和 char p2[] = "Another String. ...

  6. 利用T4模版生成EF实体

    直接上代码,只需要修改EF实体的地址就可以了. <#@ template language="C#" debug="false" hostspecific ...

  7. WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]

    原文:WCF技术剖析之二十一: WCF基本的异常处理模式[上篇] 由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂.同时,WCF设计的一个目 ...

  8. log4net使用流程

    前面大致介绍了一下log4net的概述和结构.既然都清楚了,下面我来介绍一下如何使用log4net. 使用流程 1.这里所说的使用流程就是使用log4net.dll,首先要根据你的平台来找出对应的版本 ...

  9. Jquery Mobile转场特效之slide | 小小iPhone开发

    Jquery Mobile转场特效之slide | 小小iPhone开发 2012 Jquery Mobile转场特效之slide 作者:小小   发布:2012-12-12 14:03   分类:j ...

  10. sn9c291 驱动载入成功,mpayer无法播放

    先眼下将一个sn9c291+ov9712的模块驱动在fedora上载入成功,但是在使用mplayer却无法播放,不知道为何? watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...