Gtk+, Glade3, Anjuta 编程开发小结
来源:互联网 发布:现金流量表模板有数据 编辑:程序博客网 时间:2024/05/13 18:03
转自:http://blog.chinaunix.net/u3/100915/showart_2158659.html
开发系统:
Ubuntu Release 9.10(Karmic)
Gtk+采用的是LGPL协议的自由软件包,是GNU项目的一部分。它是两大跨平台GUI toolkit之一,另一个是QT,但是QT并不是所有的版本都是开源的,分为开源版和商业版。 Linux流行的GNOME桌面环境采用的就是Gtk+开发的,Google的Linux版Chrome浏览器也是基于Gtk+开发的。 Gtk+提供了几乎所有流行开发语言(如C++,Python,C#,Java等)的绑定包,但是其native语言还是C。C也是操作系统的编写语言,Linux,Windows都是用C编写出来的。
Gtk+在Windows世界里相当于MFC或WPF。
这是Linux软件最常使用的两种开源协议,当然还有其它的BSD,Apache,MIT。
GPL全称是General Public License,Linux采用的就是GPL协议,一旦使用了含有GPL协议的代码或类库,本身也必需开源,这是所谓的传染性。
LGPL是Lesser GPL,比GPL宽松的协议,采用了LGPL代码的软件可以是闭源的。底层的类库一般就采用LGPL协议,如Gtk+和开源版的QT。
有意思的是,2009年很多公司并没有遵守GPL等开源协议:
微软Windows 7的USB/DVD下载安装工具使用了GNU的代码,一开始并没有开放源码,在Open Source人士的强烈抗议之后,重新发布了该工具的开源版本。
射手播放器项目公开谴责腾讯的QQ影音违反开源协议。在11月份,腾讯被ffmpeg发现并列入耻辱版。腾讯是一家全球IT市值排名17的公司,大陆唯一一个入围全球IT市值20强的公司。
软件自由法律中心起诉百思买集团,三星电子美国,西屋电子,JVC美国,西部数据,台湾合勤科技违反GPL等。
aMule作者要求VeryCD开源,指出VeryCD是以aMule为基础构建的。
”绿霸“被指责使用了OpenCV的haar分类过滤器,却没有遵守OpenCV的BSD协议,在版权信息中加入BSD许可证。
Glade是为Gtk+和GNOME开发出来的UI快速开发工具,它的全称是Glade Interface Designer。
它包含了Button,Label,Radio等所有控件,对齐方式以及设置消息函数。Glade3文件是一个纯XML描述的文件,Glade3版本之前,据说可以直接转成代码.h和.c。但是Glade3已经去掉这个功能了,为了UI设计跟代码完全分离出来,也比较符合现代编程思想和风格。
Glade3在Windows里相当与Blend2,它可以设计出WPF的UI。其中Blend2也是用XML描述的,叫XAML语言或文件。
使用Glade3的一点注意事项:
一开始建立的Windows窗口需要使用Contaner面板里面的一个Fixed功能先固定住,这样再添加其它控件的时候比较方便,不会出现一个Button覆盖住一个Windows窗口的情况,并且无法调节其大小。如果固定住Windows窗口,点击正中间上方的Drag and Resize就可以拖动了。
// Anjuta IDE
sudo apt-get install anjuta
// Build tools
sudo apt-get install autogen automake build-essential indent intltool
sudo apt-get install gnome-core-devel
sudo apt-get install pkg-config
// Help documents
sudo apt-get install devhelp
sudo apt-get install libglib2.0-doc libgtk2.0-doc
// Glade
sudo apt-get install glade libglade2-dev
// Gtk+ for C++
sudo apt-get install libglademm-2.4-dev libgnomemm-2.6-dev intltool
sudo apt-get install libgtkmm-2.4-doc libcairomm-1.0-doc libglib2.0-doc libgnome2-doc libsigc++-2.0-doc
测试Gtk+的编译环境,新建一个base.c的空文档,插入以下代码。
#include <gtk/gtk.h>
int main( int argc, char *argv[] )
{
GtkWidget *window=NULL;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0`
则生成一个base的可执行文件,运行./base,测试运行结果,可以看见一个窗口界面。表明Gtk+开发环境配置正确。
- 也可以将编译、链接命令写成makefile,如下:
CC = gcc
all:
$(CC) base.c -o base `pkg-config --cflags --libs gtk+-2.0`
6.Anjuta IDE编程
1. 新建Gtk+工程
File → New → Project → C → Gtk+2.0
Anjuta为我们创建了一个包含所有文件的文件夹。
从create_window()函数里的代码可以看出,*.ui是用GtkBuilder的gtk_builder_add_from_file()来读取的。
builder = gtk_builder_new ();
3. 点击Build菜单,编译main.c文件和prjoct文件。Build成功后,再打开Run菜单,执行Execute,生产一个名字为Windows的窗口。这就是默认的Gtk+窗口。
Menu是通过加入MenuBar控件,在小窗口的树状层次结构,右键点击Edit来添加子菜单。
Button,Label是直接脱控件实现。给Menu,Buton,Label取好名字就可以了,便于编程理解。
6.3 添加为名为button_Up的Button的Click响应:
Step 1:
在button属性的页面,选Signals标签,在GtkButton的clicked属性添加名为button_Up_clicked_cb()的call back 函数,anjuta会在main.c中添加一个空函数。
Step 2:
在create_window()函数里建立button和label的signal_connect连接:
// Get label_Status object
GObject* label_Status_obj = gtk_builder_get_object(builder, "label_Status");
// Get button objects
GObject* button_Up_obj = gtk_builder_get_object(builder, "button_Up");
// Connect signals (buttons --> label)
g_signal_connect (button_Up_obj, "clicked", G_CALLBACK(button_Up_clicked_cb), label_Status_obj);
g_signal_connect()函数里,将label_Status作为user data传递过去。
Step 3:
在click函数里处理事件:
void
button_Up_clicked_cb (GtkButton *self, gpointer user_data)
{
GtkWidget* labelForStatus = GTK_WIDGET(user_data);
gtk_label_set_text(GTK_LABEL(labelForStatus), "Up!");
}
至此,代码实现已经基本完成,雷同的部分作相应的处理。
- http://en.wikipedia.org/wiki/Gtk%2B
- http://www.gtk.org/
- http://baike.baidu.com/view/1047410.htm
- http://glade.gnome.org/
- http://www.awflasher.com/blog/archives/939
- 开源时代2010.01(总第十六期)
- http://www.freeoa.net/index.php?option=com_content&view=article&id=66:bsd&catid=5:commercepudct&Itemid=2
- Devhelp
- http://blog.csdn.net/Linuxdianc/archive/2009/12/21/5047600.aspx
- https://www.ibm.com/developerworks/cn/views/opensource/libraryview.jsp?type_by=文档库&view_by=search&search_by=GTK%2B+基础附录main.c 源码:
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
* main.c
* Copyright (C) alex 2010 <hldu05@163.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <config.h>
#include <gtk/gtk.h>
/*
* Standard gettext macros.
*/
#ifdef ENABLE_NLS
# include <libintl.h>
# undef _
# define _(String) dgettext (PACKAGE, String)
# ifdef gettext_noop
# define N_(String) gettext_noop (String)
# else
# define N_(String) (String)
# endif
#else
# define textdomain(String) (String)
# define gettext(String) (String)
# define dgettext(Domain,Message) (Message)
# define dcgettext(Domain,Message,Type) (Message)
# define bindtextdomain(Domain,Directory) (Domain)
# define _(String) (String)
# define N_(String) (String)
#endif
#include "callbacks.h"
/* For testing propose use the local (not installed) ui file */
/* #define UI_FILE PACKAGE_DATA_DIR"/gtk_foobar/ui/gtk_foobar.ui" */
#define UI_FILE "src/gtk_foobar.ui"
void
button_Up_clicked_cb (GtkButton *self, gpointer user_data);
void
button_Middle_clicked_cb (GtkButton *self, gpointer user_data);
void
button_Bottom_clicked_cb (GtkButton *self, gpointer user_data);
GtkWidget*
create_window (void)
{
GtkWidget *window;
GtkBuilder *builder;
GError* error = NULL;
builder = gtk_builder_new ();
if (!gtk_builder_add_from_file (builder, UI_FILE, &error))
{
g_warning ("Couldn't load builder file: %s", error->message);
g_error_free (error);
}
/* This is important */
gtk_builder_connect_signals (builder, NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
// Get label_Status object
GObject* label_Status_obj = gtk_builder_get_object(builder, "label_Status");
// Get button objects
GObject* button_Up_obj = gtk_builder_get_object(builder, "button_Up");
GObject* button_Middle_obj = gtk_builder_get_object(builder, "button_Middle");
GObject* button_Bottom_obj = gtk_builder_get_object(builder, "button_Bottom");
// Connect signals (buttons --> label)
g_signal_connect (button_Up_obj, "clicked", G_CALLBACK(button_Up_clicked_cb), label_Status_obj);
g_signal_connect (button_Middle_obj, "clicked", G_CALLBACK(button_Middle_clicked_cb), label_Status_obj);
g_signal_connect (button_Bottom_obj, "clicked", G_CALLBACK(button_Bottom_clicked_cb), label_Status_obj);
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_set_locale ();
gtk_init (&argc, &argv);
window = create_window ();
gtk_widget_show (window);
gtk_main ();
return 0;
}
void
button_Up_clicked_cb (GtkButton *self, gpointer user_data)
{
GtkWidget* labelForStatus = GTK_WIDGET(user_data);
gtk_label_set_text(GTK_LABEL(labelForStatus), "Up!");
}
void
button_Middle_clicked_cb (GtkButton *self, gpointer user_data)
{
GtkWidget* labelForStatus = GTK_WIDGET(user_data);
gtk_label_set_text(GTK_LABEL(labelForStatus), "Middle!");
}
void
button_Bottom_clicked_cb (GtkButton *self, gpointer user_data)
{
GtkWidget* labelForStatus = GTK_WIDGET(user_data);
gtk_label_set_text(GTK_LABEL(labelForStatus), "Bottom!");
}
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window">
<property name="visible">True</property>
<property name="title" translatable="yes">Alex Du's Test</property>
<property name="default_width">499</property>
<property name="default_height">400</property>
<signal name="destroy" handler="destroy" object="NULL"/>
<child>
<object class="GtkFixed" id="fixed2">
<property name="visible">True</property>
<child>
<object class="GtkButton" id="button_OK">
<property name="label">gtk-ok</property>
<property name="width_request">95</property>
<property name="height_request">39</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="x">290</property>
<property name="y">292</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_Content">
<property name="width_request">270</property>
<property name="height_request">45</property>
<property name="visible">True</property>
<property name="label" translatable="yes">This is from Alex Du's test!</property>
</object>
<packing>
<property name="x">108</property>
<property name="y">193</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_Cancel">
<property name="label">gtk-cancel</property>
<property name="width_request">96</property>
<property name="height_request">38</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="x">396</property>
<property name="y">293</property>
</packing>
</child>
<child>
<object class="GtkMenuBar" id="menubar1">
<property name="width_request">97</property>
<property name="height_request">34</property>
<property name="visible">True</property>
<child>
<object class="GtkMenuItem" id="menuitem1">
<property name="visible">True</property>
<property name="label" translatable="yes">_Place</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<child>
<object class="GtkImageMenuItem" id="imagemenuitem1">
<property name="label" translatable="yes">_Up</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image1</property>
<property name="use_stock">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="imagemenuitem2">
<property name="label" translatable="yes">_Middle</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image2</property>
<property name="use_stock">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="imagemenuitem3">
<property name="label" translatable="yes">_Bottom</property>
<property name="visible">True</property>
<property name="use_underline">True</property>
<property name="image">image3</property>
<property name="use_stock">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="x">41</property>
<property name="y">17</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_Up">
<property name="label" translatable="yes">_Up</property>
<property name="width_request">76</property>
<property name="height_request">41</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
<property name="yalign">0.47999998927116394</property>
<signal name="clicked" handler="button_Up_clicked_cb"/>
</object>
<packing>
<property name="x">42</property>
<property name="y">65</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_Middle">
<property name="label" translatable="yes">_Middel</property>
<property name="width_request">83</property>
<property name="height_request">43</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="button_Middle_clicked_cb"/>
</object>
<packing>
<property name="x">124</property>
<property name="y">65</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_Bottom">
<property name="label" translatable="yes">_Bottom</property>
<property name="width_request">82</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
<signal name="clicked" handler="button_Bottom_clicked_cb"/>
</object>
<packing>
<property name="x">213</property>
<property name="y">67</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_Status">
<property name="width_request">109</property>
<property name="height_request">42</property>
<property name="visible">True</property>
</object>
<packing>
<property name="x">18</property>
<property name="y">292</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="stock">gtk-missing-image</property>
</object>
</interface>
- Gtk+, Glade3, Anjuta 编程开发小结
- gtk+2.0和glade3.4.5的GUI编程
- gtk/glade3 教程
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- 【zz】Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade
- Linux下GUI开发:GTK+ 2.0 + anjuta + glade(转)
- ubuntu + GTK+ + anjuta
- GTK+中使用Glade3编程遇到Gtk-WARNING **: Could not find signal handler的问题
- GTK+ and Glade3 GUI Programming
- linux 下gtk+和glade编程及glade2和glade3之间的差异
- GTK+3.0加Glade3 编程时可能遇到的问题详解
- Anjuta—基于GTK+/GNOME的C/C++优秀开发环境
- LINUX 文件系统和设备文件系统
- bcp命令详解
- 紫色手环
- Visual C# 2010 Recipes A Problem-Solution Approach 代码6——运算符重载
- 关于 sicily1556 Finding Seats
- Gtk+, Glade3, Anjuta 编程开发小结
- 完成两个超长正整数的加法
- poj2154质因数分解+快速幂+欧拉函数解决
- 开启Jasper的JSP预编译支持
- 《别做正常的傻瓜》读书笔记
- 质量管理一些知识点
- 我们究竟需要一个怎样的IDE
- 详解Visual Studio 2010中ASP.NET新增23项功能
- 细数Visual Studio 2010中新增小功能