Gtk学习基础

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);

待续......

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简介 GTK (GIMP Toolkit) 是一套用于创建图形用户界面的工具包。它遵循 LGPL 许可证,所以你可以用它来开发开源软件、自由软件,甚至是 封闭源代码的商业软件,而不用花费任何钱来购买许可证和使用权。 GTK 被称为 GIMP 工具包是因为最初写它是用来开发 GIMP (GNU 图像处理程序) 的,但是它现在已经被用于很多软件项目了,包括 GNOME (GNU 网络对象模型环境)。GTK 是在 GDK (GIMP Drawing Kit) 和 gdk-pixbuf 的基础上建立起来的,GDK 基本上是对访问窗口的 底层函数 (在 X 窗口系统中是 Xlib) 的一层封装,gdk-pixbuf 是一个用于客户端图像处理的库。 GTK 的创建者是: · Peter Mattis petm@xcf.berkeley.edu · Spencer Kimball spencer@xcf.berkeley.edu · Josh MacDonald jmacd@xcf.berkeley.edu GTK 的当前维护者是: · Owen Taylor otaylor@redhat.com · Tim Janik timj@gtk.org GTK 实质上是一个面向对象的应用程序接口 (API)。尽管完全用 C 写成的,但它是基于类和回调函数 (指向函数的指针) 的思想实现的。 还 有一个名为 GLib 的第三个组件,包含一些标准函数的替代函数,以及一些处理链表等数据结构的函数等。这些替代函数被用来增强 GTK 的可移植性,因为它们所实现的一些函数在其它 Unix 系统上未实现或不符合标准,比如 g_strerror()。一些是对 libc 的对应函 数的增强,比如 g_malloc() 具有增强的调试功能。 在 2.0 版中,GLib 又加入这样一些新内容:构成 GTK 类层次基础的类型系统 (type system),在 GTK 中广泛使用的信号系统,对各 种不同平台的线程 API 进行抽象而得的一个线程 API,以及一个加载模块的工具。 作为最后一个组件,GTK 使用了 Pango 库来处理国际化文字输出。 本 教程讲述 GTK 的 C 接口。还有许多其它语言的 GTK 绑定如 C++、Perl、Python、TOM、Ada95、Objective C、Free Pascal、Eiffel、Java 和 C#。如果你想使用 GTK 其它语言的绑定,请先查看该绑定的文档。有时这些文档会讲一些重要的概念,然后你再来参考本教程。还有一 些跨平台的 API (如 wxWindows 和 V),它们把 GTK 作为一个支持的平台。同样,先参考它们的文档。 如果你用 C++ 来开发 GTK 应用程序,有以下几点需要注意。已有一个 GTK 的 C++ 绑定叫做 GTK-- (译者注:现在叫做 gtkmm),提供 一个更符合 C++ 规范的接口,你可以先看看这个接口。如果你由于种种原因不喜欢这种方法,还有另外两种使用 GTK 的方法。首先,你 可以只使用 C++ 中的 C 子集来调用 GTK,这样就可以使用本教程描述的 C 接口。其次,你可以用下述方法同时使用 GTK 和 C++:把所 用的回调函数定义为 C++ 类中的静态成员函数,然后仍然使用 C 接口来调用 GTK。如果你选择后一种方法,你可以把指向要操作的对象 3 / 258 的指针 (即所谓的 "this")作为回调函数的 data 参数。选择哪一种方法仅仅是个人的喜好问题,因为不管用哪一种方法,你都会得到 C++ 和 GTK。它们都不需要特殊的预处理程序,因此你可以同时使用标准 C++ 和 GTK。 本教程试图尽可能详细地描述 GTK,但是肯定不能面面俱到。本教程假设你能够较好的理解 C 语言,并且了解怎样编写一个 C 程序。有 X 编程经验会很有帮助,但不是必要条件。如果 GTK 是你学习的第一个构件工具包,请告诉我们你怎样找到这个教程,以及学习时有什 么困难。还有其它一些语言的绑定,如 C++、Objective C、ADA、Guile 等,但我不了解这些。 本教程仍在不断完善中。请到 http://www.gtk.org/ 查看更新情况。 我非常乐意听到你在使用本教程学习 GTK 时遇到的各种困难,并欢迎对怎样改进此文档提出建议。更多信息请参阅投稿这一章。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值