GTK是完全按照面向对象思想设计的一套组件,如果你用过java的Swing那就应该会很容易的理解这个东西。按我现在的水平,我只当GTK就是 些图形组件。Glade是可以让你用拖拽的方式来给GTK这些组件进行布局的,用过Netbeans进行Swing设计的应该会明白,当然如果你用过垃圾 的VC(ABitNo坚决讨厌这些东西)什么的也会明白。不过不明白也没关系,下面就一切从0开始讲解。
现在ABitNo假设读者会用c,gcc,make。不过不会的话还是没有关系,下面会把每一步需要的命令都列出来。
1、准备开发环境
Linux,GTK+-2,Glade 3.6,gcc,make,Glib2,MySQL
上面这些东西并不是现在就都会用到,是以后的文章中会用到的。由于这些都不是重点,所以就不详细介绍了,如有不明白的就留言,ABitNo愿意帮忙。另外非常推荐安装Devhelp,Linux下软件开发会经常用到的。
2、认识Glade
当你打开Glade3时,会出现一个Unsaved 1的对话框,这个是让你选择现在这个Project的一些基本属性。这里就按照默认的,不要修改,至于具体的含义要留到以后的文章中介绍了。我们来认识下 你看到的Glade窗口,最上面是菜单栏,菜单栏下面的是工具栏;左边那列叫Palette,你所需要的组件都在那里了;中间那个最大的白色空间是你的工作区;右边上部的白色部分叫Inspector,是你添加的组件的一个导航列表;右边下部是Properties,当你点击了某个组件后,在这里会出现它的属性,你可以对它们进行编辑。
3、设计界面
这个应该就不困难了,就是点击Palette里的组件,然后摆放位置,调节属性。如果你不明白应该如何去做,那就按照我给出的这个小示例来一步步走。
这样我们的界面就设置完成了,保存为abitno.glade。最后的设计和Inspector里的内容会像下面这样
4、编写代码
这一步才是关键,界面设计是次要的,Glade就是把界面与代码分开,这样更便于维护。先不多说了,直接看代码,代码里ABitNo都已经把注释写的很详细了,如果仍然有不明白的可以提出来。
你现在要做的就是打开一个编辑器,如gedit,在abitno.glade所在的文件夹里编辑一个文件abitno.c,内容如下:
5、编译运行
当你的代码都写完了,那就保存,准备编译了,用下面的命令
gcc -o abitno abitno.c `pkg-config --cflags --libs gtk+-2.0` -export-dynamic
要注意,pkg-config前后的那个不是单引号,而是ESC下面那个键。
然后通过下面的命令来运行
./abitno
如果一切顺利的话,就会出现一个窗口,上面只显示一个ABitNo按钮,你点击它就会出现一句话“I Love ABitNo.LinPie.com“,如下图
我很郁闷gtkbuilder到现在还没装,所以改了个libglade的版本:
/*
* File :abitno.c
* Author: ABitNo
* Email: [email protected]
* Website: ABitNo.LinPie.com
*/
/***********************************************************************
* 这句include就是简单的包含gtk的头文件 *
***********************************************************************/
#include <glade/glade.h>
#include <gtk/gtk.h>
/***********************************************************************
* 从名字就可以看出这是一个button被点击时要执行的函数 *
***********************************************************************/
void on_button_clicked(GtkWidget *widget, gpointer label)
{
/*这是gtk的一个函数,用来给Label设定文字*/
gtk_label_set_text(GTK_LABEL(label),"I Love ABitNo.LinPie.com");
}
int main(int argc, char *argv[])
{
/*这些語句声明了一些组件变量,由于GTK是面向对象的,
所以都可以声明为GtkWidget,这也是习惯作法 */
GladeXML *gxml;
GtkWidget *window;
GtkWidget *button;
GtkWidget *label;
/*每一个gtk程序都会用到这一句,用来初始化*/
gtk_init(&argc, &argv);
/*用下面这个gtk函数把abitno.glade的内容给builder*/
gxml=glade_xml_new("1.glade",NULL,NULL);//注意这行的glade1.glade对应的是界面保存时的名称
/*通过名字从abitno.glade中读取我们需要使用的组件*/
glade_xml_signal_autoconnect(gxml);
window=glade_xml_get_widget(gxml,"window1");
button=glade_xml_get_widget(gxml,"button1");
label=glade_xml_get_widget(gxml,"label1");
g_signal_connect( G_OBJECT(button), "clicked",
G_CALLBACK(on_button_clicked), (gpointer)label);
/*这是glib里的一个函数,用来把一个组件与一个函数关联起来,下面
这句就是把button和我们上面的那个on_button_clicked给关联了*/
gtk_widget_show(window);
gtk_widget_show(button);
gtk_widget_show(label);
gtk_main();
return 0;
}