gtk+blade+anjuta 的简单实例
gtk+blade+anjuta 的简单实例我的系统 ubuntu 12.04
不正确会有很多问题,速度慢,找不到安装的软件。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.glade1: 添加个窗口在“常规“(general)面板中设置窗口的属性“名称”(name)中写入窗口ID,默认值为window1, 源码实例化时会用到2: 触发gtk中的函数在“信号”(signal)面板中设置触发为简单起,只在窗口销毁时触发我们的函数,gtk销毁的信号是在GtkWidget中继承的,所以在“GtkWidget”的树形结构中设置“处理函数”的值:选中"destroy"信号,在“处理函数”列中设置值:on_windown1_destroy. 这个值其实就是在gtk中的源码中调用的为做测试,在添加个,一个信号可以设置多个选中"destroy"信号,在“处理函数”列中设置值:on_windown1_destroy_my
生成的文件: test.gladewindow1">Falsew_titleon_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))voidon_window1_destroy (GtkObject *object, gpointer user_data){DBG("------");gtk_main_quit ();}voidon_window1_destroy_my (GtkObject *object, gpointer user_data){DBG("------");gtk_main_quit ();}intmain (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中的函数
启动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.ccat 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.uiwindow">Truewindow500400destroy"/>我用不同的颜色标识他们的区别与联系
和上面我们自己用glade+gtk例子手动完成的几乎一样。
通过后面的几个测试,就对gtk的开发有个初步认识。
Micah 2007年 《GTK+ and Glade3 GUI Programming Tutorial》
某热心人对上面的翻译
gtk+blade+anjuta 的简单实例的更多相关文章
- laravel5.1框架基础之Blade模板继承简单使用方法分析
本文实例讲述了laravel5.1框架基础之Blade模板继承简单使用方法.分享给大家供大家参考,具体如下: 模板继承什么用? 自然是增强基础页面的复用,有利于页面文档的条理,也便于更改多处使用的内容 ...
- Hibernate(二)__简单实例入门
首先我们进一步理解什么是对象关系映射模型? 它将对数据库中数据的处理转化为对对象的处理.如下图所示: 入门简单实例: hiberante 可以用在 j2se 项目,也可以用在 j2ee (web项目中 ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- 修改js confirm alert 提示框文字的简单实例
修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...
- 利用navicat创建存储过程、触发器和使用游标的简单实例
利用navicat创建存储过程.触发器和使用游标的简单实例 标签: navicat存储过程触发器mysql游标 2013-08-03 21:34 15516人阅读 评论(1) 收藏 举报 分类: 数 ...
- 【转】Android Https服务器端和客户端简单实例
转载地址:http://blog.csdn.net/gf771115/article/details/7827233 AndroidHttps服务器端和客户端简单实例 工具介绍 Eclipse3.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. ...
- vue路由的简单实例
vue2.0 和 vue1.0 路由的语法还是有点稍微的差别,下面介绍一下vue-router 2的简单实例: <!DOCTYPE html> <html lang="en ...
- Flume概述和简单实例
Flume概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统.支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方( ...
随机推荐
- Linux开机启动十步骤
启动第一步--加载BIOS 启动第二步--读取MBR 启动第三步--Boot Loader 启动第四步--加载内核 启动第五步--用户层init依据inittab文件来设定运行等级 启动第六步--in ...
- oracle 11g 11.2.0.1 设置HuagePage导致TRC 变大 变多
最近发现diag/..../trac/ 目录下 sid_ora_xxxx.trc 文件大小为11M 而且类似文件数量很大.导致占用了8G硬盘空间 另外个同事说他的DG没有这个问题. 都一样的系统和一 ...
- 设计模式(二)单件模式Singleton(创建型)
SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...
- python binary lib on win/各种python库的二进制包
虽然很不愿意在windows上折腾python,但有时linux不在身边的时候还得在windows上写代码.很久之前找到这个地址,后来忘了,今天搜了半天才把它找到,所以记录一下. http://www ...
- SQL之单行函数
单行函数语法: function name(column|expression,[arg1,arg2,...]) 参数说明: function name:函数名称 column:数据库列名 expre ...
- Leetcode 线性表 Swap Nodes in Pairs
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie Swap Nodes in Pairs Total Accepted: 12511 Tota ...
- Reader开发(二)增加PDF阅读功能
最近任务很多很忙,所以更新博客的速度很慢. 大概上周就为Reader加了一个PDF阅读的功能,但是一直没时间写上来.昨晚找一下文件发现扩展了功能的Demo居然在文件目录下看不到任何文件,但是却显示有文 ...
- ubuntu无法解析主机错误与解决的方法
今天在用命令行进行操作的时候,出现了无法解析主机的错误.google了一下,原来是hosts文件的问题.更改过来即可了 进入终端,输入 sudo gedit /etc/hosts.输入password ...
- POJ 2286 The Rotation Game 迭代搜索深度 + A* == IDA*
感觉这样的算法还是比較局限的吧,反复搜索是一个不好的地方,并且须要高效的估值函数来进行强剪枝,这点比較困难. 迭代搜索深度是一个比較炫酷的搜索方式,只是有点拿时间换空间的感觉. 首先迭代深度比較搓的写 ...
- 网页内容的html标签补全和过滤的两种方法
网页内容的html标签补全和过滤的两种方法: 假设你的网页内容的html标签显示不全,有些表格标签不完整而导致页面混乱,或者把你的内容之外的局部html页面给包括进去了,我们能够写个函数方法来补全ht ...