gtk认识
GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。并且,GTK+也有Windows版本和Mac OS X版。
GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。差不多已经 10 年过去了。今天,在 GTK+ 的最新稳定版本 —— 2.8 版上(3.0测试中),仍然在进行许多活动,同时,GIMP 无疑仍然是使用 GTK+ 的最著名的程序之一,不过它已经不是惟一的使用 GTK+ 的程序了。已经为 GTK+ 编写了成百上千的应用程序,而且至少有两个主要的桌面环境(Xfce 和 GNOME)用 GTK+ 为用户提供完整的工作环境。
GTK+虽然是用C语言写的,但是您可以使用你熟悉的语言来使用GTK+,因为GTK+已经被绑定到几乎所有流行的语言上,如:C++,PHP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel。
GTK 官网:The GTK Project - A free and open-source cross-platform widget toolkit
GTK-Project:https://www.gtk.org/download/index.php
1、GTK特点
现代化、更新快:GTK+ 是采用软件开发中的最新技术开发的,只要发现缺陷(BUG)(肯定有缺陷,因为没有任何软件是完美的),开发人员就会尽力在下一版本中修补缺陷。使用现代的软件意味着,您不会陷在过时的工作中,而跟不上时代的发展。
国际化、可访问性:在创建要让所有人使用的软件的时候,请记住三个关键字:国际化、本地化和可访问性(通常分别缩写为 i18n、l10n 和 a11y)。
简单易用:这一点应当很明显,但是它实际上含义丰富。工具包对用户应当容易,这样才有可能创建简单的、直觉的和乐于使用的界面,哪怕针对的是新手。创建人机交互的正确模型不是一项简单的任务,GTK+ 正是长时间工作的结果,而且是众多的甚至困难的决策的结果。
设计灵活、可扩展:编写 GTK+ 的方式允许在不扭曲基本设计的情况下,让维护人员添加新功能、让用户利用新功能。工具包也是可扩展的,这意味着可以向其中添加自己的块,并用使用内置块一样的方式使用它们。例如,可以编写自己的控制元素,比如说用于显示应用程序处理的科学数据,并让它正确地遵照用户选择的显示风格,就像 GTK+ 自身的控件那样。
自由、开放:自由软件 意味着每个人不仅可以自由地获得和使用这个工具包,还可以在满足某些条件的情况下修改并重新发布它。自由开放源码许可 意味着这些条件不是严格限制的,可以得到的自由程度是显著的。
可移植:GTK+ 是可移植的。这意味着用户可以在许多平台和系统上运行它。另一方面,开发人员可以把软件提供给众多用户,却只要编写一次程序,还可以使用许多不同的编程和开发平台、工具和编程语言。所有这些都可以理解为更多的潜在用户,您可以利用更好地满足需求的更广泛的技能和工具。
注:以上为copy的,自我总结就是类似于qt那样的GUI开发框架、内部框架虽然是c语言编写、但是用的是c++面向对象的概念。类似于还有AWTK(国产)、x-window.......,在linux系统上使用比较多。因为开源、稳定、成熟等的特点
Gtk安装
gtk安装及编译
我也觉得这部分比较难,我都是用的公司的库。自己还没编译过,编译简直是比使用还困难的东西。只能百度去看看hhhh.......
Gtk基础使用
gtk控件使用
控件都属于widget这个结构体,也就都拥有widget那些属性、公有的信号、和widget的方法(函数)。然后再是每个控件固有的属性、方法、信号你要是安装了glib库,可以通过函数跳到文件中去查看一些方法。
注:遵循二八原则(就是百分之八十的使用,都在百分之二十的函数中)、学习基础的使用就好了,不会的再百度。搞一个测试程序多使用函数学的就很快,感觉学GUI最痛苦的就是不知道函数、里面的具体信号和对应的事件函数的具体参数(所以下面是那百分之二十当中的十)
以下是基于gtk2.0写的自我学习的一些基础、很多细节没有表述清楚,但是你通过多写代码一定会发现,每个函数对应的具体的功能
信号与事件对应的回调函数
信号、和事件,类似于GUI都有这些。控件的信号绑定对应的事件函数,控件操作事件函数就会响应。信号可通过官方文档或者下载了glade,点击那个红色书按钮即可查看信号和函数(全是英文.......)
下面是信号注册函数,就是把事件函数注册到对应的信号上去。
信号注册函数:
gulong g_signal_connect(
gpointer instance, //要绑定的控件,用G_OBJECT转换
const gchar *detailed_signal,
GCallback c_handler,//有很多种,具体的要看对应的控件
gpointer data );
instance:信号发出者,可以认为我们操作的控件,如按下按钮,这个就为按钮指针
detailed_signal:信号标志,如"pressed"
c_handler:回调函数的名称,需要用G_CALLBACK()进行转换
data:给回调函数传的参数,gpointer 相当于C语言的 void *
返回值:注册函数的标志
窗口布局
布局的一些容器添加进去,也属于GUI的常用三件套里面的(信号事件、布局、控件)。每个控件本身自带布局,但这种布局是根据控件的大小来自动填充。窗口布局也属于widget,盒子控件(hbox、vbox,目前只知道这两个)
/*这个函数为常用的控件添加到布局的函数(自动填充式布局),肯定也要把布局添加到窗口里面。
不然飘到外面就看不到*/
gtk_container_add(GTK_CONTAINER(window), vbox)
/*将组件加到组装盒中并设置周围的填充大小,如果布局创建为TRUE,则不需要
* box 组装盒的名称
child 子构件的名称
expend 构件周围是否还有可扩充的空间
fill 构件是否需要充分利用构件周围空间
padding 构件周围要保留多少个填充的像素
*/
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);//只能用于box(盒子)控件
//window控件肯定不是盒子啦
垂直布局
水平布局
/*---------------------------布局和控件-------------------------*/
/*homogeneous:容器内控件是否大小一致(gboolean 取值为TRUE 或 FALSE)
spacing:控件之间的间隔(以像素点为单位),gint相当于 C语言的int
返回值:水平布局控件指针*/
hbox = gtk_hbox_new(TRUE, 10);
//gtk_container_add(GTK_CONTAINER(window), hbox);
vbox = gtk_vbox_new(TRUE, 5);
//gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
表格布局
像表格一样的布局
/*rows: 行数
coumns: 列数*/
table = gtk_table_new(2, 2, TRUE);
//添加到合适的点位
/*布局点位图:
* 0 1 2
* |------|------| A(0,1,0,1)
* 1|--—A—-|--—B-—| B(1,2,0,1)
* 2|------C------| C(0,2,1,2)
*/
gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 1, 0, 1);
固定布局
上面的布局还会根据自身布局的属性来改变控件的大小,这个布局完全是自由的,你想放在那里、设置宽高,都不会根据布局自身而改变大小。所以如果你在后面的控件中想添加布局,最好先添加一个fixed布局然后再添加其它布局,这样你的布局就很美观、自由。
fixed_box = gtk_fixed_new();
/* fixed:容纳控件的容器
widget:要添加的控件
x, y:控件摆放位置的起点坐标*/
gtk_fixed_put(GTK_FIXED(fixed_box), button[3], 0, 0);
/* fixed:容纳控件的容器
widget:要添加的控件
x, y:移动的位置*/
gtk_fixed_move(GTK_FIXED(fixed_box), button[3], 10, 10);
window窗体
控件都是在一个主窗体里面
//gtk初始化gtk_init
void gtk_init (int *argc, char ***argv)//这个函数为所有gtk初始化函数,必须有,放在程序开始
//函数功能: gtk初始化,会在每个gtk程序中调用。
// 该函数设定了默认的视频(visual)和颜色映射模式(color map)。
/*---------------------------窗口-------------------------*/
/* 创建一个新窗口
GTK_WINDOW_TOPLEVEL:顶层窗口,有边框
GTK_WINDOW_POPUP: 弹式窗口,没边框
*/
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* window:窗口
title:标题
*/
gtk_window_set_title(GTK_WINDOW(window), "first love");//设置窗口标题
gtk_container_set_border_width(GTK_CONTAINER(window), 5);//设置容器与边框的宽度
gtk_widget_set_size_request(window, 1020, 768);//设置控件大小
/* window:窗口
resizable:TURE默认属性,可伸缩,FALSE不可伸缩
*/
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);//窗口伸缩设置
/* window:窗口
position常用有4种情况:
GTK_WIN_POS_NONE: 不固定
GTK_WIN_POS_CENTER: 居中
GTK_WIN_POS_MOUSE: 出现在鼠标位置
GTK_WIN_POS_CENTER_ALWAYS: 窗口总是居中
*/
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);//窗口在显示器位置的设置
/* 最后一步是显示新创建的按钮和窗口 */
//gtk_widget_show(label);//一个一个显示控件
//gtk_widget_hide(label)//隐藏一个控件
gtk_widget_show_all(window);//显示窗口上所有控件
// gtk_widget_hide_all(window);//隐藏所有控件
/* 所有的 GTK 程序必须有一个 gtk_main() 函数。程序运行停在这里
* 等待事件 (如键盘事件或鼠标事件) 的发生。*/
gtk_main();//一直循环等待事件发生
//gtk_main_quit()//退出循环
基础控件
每个控件还可以设置值
g_object_set_data(GObject* object, gchar* key, gpointer user_data)
这个函数是让object对象携带user_data这个指针值,
然后通过g_object_get_data(GObject* object, gchar* key)这个函数,
利用key指向的字符串取出user_data值,进而通过user_data可以访问它指向的对象
常用控件(button、label、check_button、image)
常用的函数有联想功能的话都会明白,一般都是get_text,set_text等......
button上面的字体,其实是一个label标签,所以label的方法也适用于button
/* 创建一个标签为 "Hello World" 的新按钮。*/
button = gtk_button_new();
button = gtk_button_new_with_label("open_dlg");//创建一个btn,并设置标签
/*常用函数*/
//gtk_button_set_label,gtk_button_get_label(获取和设置文本)
//gtk_widget_set_sensitive 控件是否可使用设置,FALSE变灰,不允许相应响应
//gtk_button_set_image,gtk_button_get_image 给按钮设置/获取一张图片
//gtk_button_set_relief 设置按钮透明背景色 GTK_RELIEF_NONE为透明
/*button常用信号
* "clicked" : 按下按钮时触发
"pressed" : 释放按钮时触发
"released" : 释放按钮时触发
*/
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(hello), (gpointer)"1");
void hello(GtkWidget* widget, gpointer user_data)
{
//在这里插入button控件响应函数的操作;
}
//以下属于给btn按钮设置字体颜色
GdkColor black = { 0,255,255,255 };
gdk_color_parse( "#0080FF", &color );
/*GtkStateType:
GTK_STATE_NORMAL,正常状态下的
GTK_STATE_ACTIVE, 进行操作状态
GTK_STATE_PRELIGHT,按压操作状态
GTK_STATE_SELECTED,选中操作状态
GTK_STATE_INSENSITIVE 进入操作状态
gtk_widget_modify_bg来设定控件的背景颜色
gtk_widget_modify_fg设置前景颜色
gtk_widget_modify_font设定字体
gtk_widget_modify_text来改变文字录入控件录入的文字颜色
gtk_widget_modify_base来改变文字录入控件的背景颜色*/
GtkWidget* labelchild = gtk_bin_get_child(GTK_BIN(btn));//获取btn按钮中的label控件
GdkColor green = { 0,0,0xffff,0 };
GdkColor black;
GdkColor white = { 0,255,0,0 };
gtk_widget_modify_bg(btn, GTK_STATE_NORMAL, &green);
gtk_widget_modify_fg(btn, GTK_STATE_NORMAL, &green);
GtkWidget* label = gtk_label_new("hello");
//设置label的字体样式
//前景色(red 或者 #00FF00) 下划线 下划线颜色 字体大小 html的样式颜色
gtk_label_set_markup(GTK_LABEL(label), "<span foreground='red' underline='double' underline_color='blue' font_desc='32'>label for test!</span>");
gtk_container_add(GTK_CONTAINER(window), label);
待续......