网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月22日漏签0天
gtk吧 关注:2,296贴子:4,917
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 3 4 下一页 尾页
  • 101回复贴,共4页
  • ,跳到 页  
<<返回gtk吧
>0< 加载中...

[原创]gtk教程每周两更新

  • 只看楼主
  • 收藏

  • 回复
  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为了帮助更多的初学者少走弯路,更好的掌握gtk,决定写一个gtk教程。以前国外有一本《foundations of gtk+ development》是一本很好的书,不过是英文的而且有一点过时了。我这本书的结构主要是参照这本书的,内容上做到与时俱进。
先说说gtk+(gtk和gtk+现在基本上是同义词)的版本,主要有2和3.目前只有gtk+2可以同时在linux和windows下使用,gtk+3还只能在linux下使用。虽然3更优秀,但绝大多数情况下代码是没有区别的,本教程的几乎所有程序都可以在2或3上用,如果只能在3上用我会特别强调的。
今天先写这么多,下次写一下第一章第一节gtk+的历史


  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天更新一下gtk的历史。
1.1 gtk历史
GIMP Toolkit (GTK+)设计初衷是为实现一个矢量图形编辑器,名字叫GNU Image Manipulation Program (GIMP)。三个程序员,Peter Mattis、Spencer Kimball和Josh MacDonals在1997年创建了GTK+,他们当时任职于伯克利加利福尼亚大学“eXperimental Computing"机构。
GTK+的使用授权协议是“Lesser General Public License (LGPL)”,它被两个最流行的Linux桌面系统采用,作为默认图形系统工具集,它们是GNOME和XFCE。当初它被用于Linux操作系统,GTK+后来扩展到支持其他类UNIX系统:Microsoft Windows, BeOS, Solaris, Mac OS X等。
注意: LGPL授权协议是GTK+区别于其它开源图形软件工具集的一个显著特征之一。LGPL更容易被那些拥有自己版权的软件接受,不象许多其它开源协议。这使得GNOME桌面系统,它就是采用了GTK+,成为一个商界工业界流行的选择。最主要的区别在于可以使用GTK来开发非开源的商业程序,而QT就不可以。
GTK+目前处于第三版,GTK+ 3。原来的分支,GTK+ 2,却使用的也非常广泛,而且他们的兼容性非常好,使得大部分程序都可以不加修改的使用gtk+2和3。前面说过,本教程绝大多数案例可以同时用于2和3,对于3的新特性我会特别注明的。


2025-08-22 23:29:51
广告
不感兴趣
开通SVIP免广告
  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天比较闲,再写一篇Gtk+用到的库
1.2 Gtk+用到的库
最开始当然是xwindow,这是所有linux下图形界面的基础。
在1984年,Jim Gettys和Bob Scheigler在马萨诸塞工业大学创建了X Window系统(X11),作为一个平台无关的显示环境,目的是调试Argus系统。现在X.Org基金会负责开发X11,它成为一个Linux和类Unix操作系统标准的显示引擎。作为最基本的平台,X11为窗口提供了位图显示功能。
现在X Window系统被用于Linux和其他操作系统,比如微软的Windows不适用它。然而,GTK+的另外一个好处,就是它隐藏了和底层渲染系统进行交互,无论你使用的是什么系统。这样你的代码就一样了,无论你是在Linux、Windows或Mac OS X上开发的。
回到Linux,X11在最基本最抽象的层面管理窗口。它在屏幕上画出了窗口,操作图形环境。在图形环境中,X11同时控制输入设备,比如鼠标和键盘。
X11基本的编程接口是Xlib,它提供了创建图形显示界面的工具。尽管基于XLib开发是可能的,但是大部分程序员更情愿使用一个类似GTK+的图形工具集,因为大部分底层调用都被这些库隐藏了。
X11独步天下一个最主要的特性,就是它假定服务器和客户端是彼此无关的。这使得客户端可以脱离服务器,在远程运行。
注意: X Window系统的客户端和服务器定义和传统定义有些区别。客户端是运行应用程序的机器。服务器端指的是用户本地显示,而不是远程机器。
X Window系统的另外一个好处,就是它没有限定界面风格。这使得图形显示界面(GUI)可以随心定制。这就是为什么桌面管理器可以提供如此不同的界面和主题。这使得几天的Linux用户拥有了选择的自由。
讽刺的是,这种自由居然成为谴责X11的 一个最重要的理由。许多人惧怕这会造成Linux程序员社区的分裂。但是迄今为止,我们还可以继续享受桌面管理器给我们带来的欣喜,选择最适合我们需要的。
你,作为一个程序员,不需要直接使用X Window系统,因为GTK+库已经帮你做了。你可以创建窗口和控件,你可以操作这些界面和用户进行交互,所有的屏幕渲染和XLib底层函数调用都自动完成了。
因此,本教程不再涉及X Window系统,而是集中在GTK+库上。欢迎你主动去寻找关于X11、X.Org基金会更多的材料,www.x.org。
另外,现在linux下出现了一个新的接替者:wayland,目前它还很难超越x11,但是这一天估计终究会来临。使用gtk不需要关心这个问题,因为gtk已经支持wayland了,而且编出的程序也不会有任何区别,这也是gtk的一个优点吧。
Gtk还依赖于一些其他的库,
Cairo
从版本2.8以后,一个二维图形渲染引擎,叫做Cario,提供了渲染功能。Cairo的创建,是为了在不同平台和系统中提供一个稳定的矢量图形渲染功能。它也允许窗口管理器使用硬件加速,如果硬件有这个能力。
简单的说,就是gtk利用cairo来绘制控件。
这个教程不包含Cario本身,除了和GTK+打印API有关的内容,因为这些调用您需要和GTK+底层打交道。如果您打算修改GTK+源代码的话,这也是一个很重要的领域您需要探索。访问www.cairographics.org,您可以获得关于Cairo更多介绍。
GLib GLib是一个用于非图形功能的用途广泛的工具。GTK+需要用到GLib,但是它也可以独自工作。正因为如此,有些应用程序使用GLib,不用包含GTK+库,就可以提供很多功能。 使用GLib一个主要的好处是它提供了一个跨平台的接口,让你的代码可以在不用的操作系统中运行,仅仅需要轻微修改,而不是完全重写。GLib的另外一个优势就是它为开发人员提供了丰富的数据类型。 GLib为C程序员提供了一些数据类型,这些数据类型默认也被其他语言所支持,比如单向和双向链表。其他一些数据类型包括双端队列、自平衡二叉树和不平衡n叉树。 . 哈希表允许您创建数据指针的队列。它们和链表不同,因为访问元素不是通过一个整数引用,而是另外一个指针作为键值。 .



  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
GLib的字符串和C++有点类似,因为他们都是一个随着数据的增加自动增长的文本缓冲区。他们都和printf()很好地集成在一起。 . 相同大小的内存片是创建内存段的高效实现方式。他们也可以用来创建相同大小的元素队列。在GLib 2.10发布以后,这个结构被内存段替换。 . 在简单的API中, 缓存让你共享巨大的、复杂的数据结构,这有助于您节省空间。这些被GTK+应用于风格和图形设备上下文,因为这些内容都开销巨大。GLib提供了其他数据类型,其中许多都会在第六章介绍。另外,GLib实现了除数据类型之外的其它特性。它还给您提供了很多各种类型的工具函数。举例来说,您会发现文件管理的工具函数、支持国际化的、字符串、警告、调试标志、动态加载模块、自动结束字符串等等。 在第六章中,您将学习到空闲函数,超时函数,以及定时器——所有这些为开发者提供了一个有趣而强悍的平台。空闲函数允许您调用一个函数,当处理器处于空闲状态时。超时函数可以在一个指定的时间以后调用一个函数。在初始化一个计时器以后,它可以时刻跟踪时间的流逝。这些函数分别可以被用来在空闲的时候检查更新,用来实现自动保存,或者用来记录花费的时间。 因为GLib具有跨平台的特性,使得分叉进程、文件访问、内存管理和线程的应用更为方便。对于跨平台的开发者来说,上述任何一项都是噩梦。GLib帮你应付了这些麻烦,这样您就不需要担心跨平台兼容性问题了。我还单独写了一个glib的教程,也是每周两更新的:
http://tieba.baidu.com/p/1928886753
特别介绍几个glib的和gtk关系最大的几个概念
GObject 本来,以GtkObject类的形式来描述,GLib Object System (GObject)是GTK+ 1库的一部分。GTK+ 2.0发布以后,这些内容被放到了它自己的库中,随GLib一起发送。 GObject由于它的复杂性饱受批评,因为它的API提取似乎非常极端。然而,它最初设想是允许从其它语言中轻松访问C对象。虽然是它是通过c语言实现的,但是能从其它语言访问C对象的功能,为它提供了更广泛的应用舞台。 最困难的是:每个开发语言都有不同的数据类型,无论这些不同看起来在表面或者内部。举例来说,在C里面,你有的数据类型是字符、长整数和整数。其他编程语言,比如Perl,没有类似的数据结构,因为变量的类型在使用的时候才确定下来。GObject终于解决了这些限制,缺点就在于创建新对象是个复杂的过程。 GObject也用C写了一个完全面向的接口,这些内容的细节贯穿于本节和本书余下的章节中。这个系统是GTK+构件继承结构的基础,同时也是许多GTK+支持库的基础。GObject面向对象的编程接口,有些是由通用的、动态的数据类型来实现的,名字叫GType。GType允许程序员通过单继承类结构,来实现许多不同的动态的数据类型。单继承是对象继承的形式之一,意思是每个子类有且仅有一个父类。在本书的第二张中,我们还将讨论这个话题,在您了解了GTK+构件以后。 除了创建扩展的数据类型,GObject为程序员提供了许多基本数据类型,又称“非类”(nonclassed)数据类型。所谓“非类”数据类型,就是一个根部的类,其它类由它派生。有一点很重要,根类不从任何其它的类继承而来。 “Table 1-1”提供了一个列表,包括最重要的“非类”数据类型。每个成员都给出了GType宏、C变量描述符和一个描述,有的还包括取值范围,如果有的话。 Table 1-1 标准 GObject “非类”数据类型GType C 类型 描述
G_TYPE_NONE 空数据结构,等价于voidG_TYPE_CHAR gchar 等价于标准C的char



  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
G_TYPE_INT gint 等价于标准C的int。取值范围是从G_MININT到G_MAXINT。
G_TYPE_LONG glong 等价于标准C的long。取值范围是从G_MINLONG到G_MAXLONG。
G_TYPE_BOOLEAN gboolean 标准的布尔数据类型,包括TRUE或者FALSE。
G_TYPE_ENUM GEnumClass 标准的枚举数据类型,等价于C的enum。
G_TYPE_FLAGS GFlagsClass 位域,用来包含多个布尔标志。
G_TYPE_FLOAT gfloat 等价于标准C的float。取值范围从-G_MAXFLOAT到G_MAXFLOAT。
G_TYPE_DOUBLE gdouble 等价于标准C的double。取值范围从-G_MAXDOUBLE到G_MAXDOUBLE。
G_TYPE_STRING gchar* 等价于以空为结束符的C字符串。
G_TYPE_POINTER pointer 一个未定类型的指针,类似于void*。 GObject为GTK+提供了另外两个重要的数据类型:GValue和GObject。GValue是一个通用的容器,它可以包含任何已经定义的结构。这允许函数可以返回任意数据类型的一段数据。如果没有GValue,GTK+面向对象的特性就无从谈起。 G_TYPE_GOBJECT,亦即GObject,是GTK+构件类继承关系的基础。它允许构件从他们的父类继承属性,包括样式属性和信号。 GObject是一个单继承系统,只允许每个子类有且仅有一个父类。子类继承了父类的全部特性,从各方面来看,子类就是父类!在第11章中,你可以了解如何使用这个系统来实现继承自定义的GTK+构件。 GObject同时为构件提供了信号系统,对象属性系统和内存管理。在下一章中我们将逐一探索这些内容。
GDK
GIMP Drawing Kit(GDK)是一个计算机图形库,最初设计为X Window系统封装底层绘制和窗口功能。GDK扮演的角色位于Xlib和GTK+之间。 在GTK+应用程序中,它负责渲染图像、矢量图形、光标和字体。同时,既然它存在于每个GTK+程序中,GDK还负责处理拖拽和窗口事件。
GDK为GTK+构件提供了画屏幕的能力。为了实现这个目的,每个构件都会和一个GdkWindow对象相关联,除了几个构件不需要它,我们在后面会谈到。GdkWindow本质上是一个屏幕上的矩形区域,在这个区域中画出构件。GdkWindow同时允许构件截获X Window系统的事件,这会在下一章中谈到。 GDK现在被移植到Windows和Mac OS X中。在GTK+ 2.8以后,Cario依然被包含进来。 GdkPixBuf GdkPixBuf是一个较小的库,它提供了客户端图像管理功能。它创建的时候是作为GNOME Imaging Model (Imlib)的替代。图像可以从文件中载入,也可以通过库函数直接喂数据。在后面的章节中,我们会看到,当给树形控件添加图像的时候,当创建GtkImage构件的时候,我们会用到它。
GtkPixbuf的一个优势就是它使得图片可以交叉引用。这意味着一个GdkPixbuf图像可以被同时显式到多个地方,而图像数据存储在一块内存之中。只有在所有的引用都消失、引用计数器归零时,它才会被销毁。
GdkPixbuf库继承了Libart的优点,那是一个随GNOME一起发布的二维图像库,它使用了图像矩阵变换技术。正因此如此,你可以自由缩放、旋转和错切图片。使用GdkRGB库,图片会被渲染到可绘制区域。通过使用这么一个专门的库,GdkPixbuf的图像渲染能力很强。
GdkPixbuf,虽然是一个较小的库,却提供了与图片管理和显示相关丰富的功能。在本书中,这个库作为最基本的应用。关于GdkPixbuf更高级的 话题,请自行参阅它的API文档。



  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Pango GDK负责处理渲染图像和窗口的同时,Pango负责控制文本和字体输出,输出关联的是Cairo或者Xft,这和你的GTK+版本相关。它也可以直接渲染到一个内存缓冲区,这种情况不再需要额外的库来支持。
注意:Pango一词的pan,发源于希腊单词,意思是“所有的”;go来源于日本的单词,意思是“语言”。这个名字源于设计它的目的就是为了支持所有的语言,让它成为一个国际化字体渲染引擎。 对于Linux客户端字体,Pango使用的是FreeType和fontconfig库。让Pango与众不同的原因就是因为它支持许多语言。几乎全世界所有的语言都支持,这让应用程序从此不在为国际化而发愁。 Pango内部使用的所有文字都是用UTF-8编码。使用UTF-8时为了能和那些8-bit软件兼容,这种软件在UNIX平台上还是很常见的。UTF-8编码的偏移量是基于字符的,不是固定bits,因为每个字符可能占用不止一个字节。在第七章中你将学习如何使用GtkTextView构件,这点尤其重要,因为你不得不设置字符的偏移量,它们可不一定总是一个字节。 Pango支持很多字体属性。举例来说,这些属性包括语言、字体、风格、字重、拉伸、字号、前景颜色、背景颜色、下划线、删除线、上升、外形和比例。不限于上面这些属性,很多属性自己还提供了多种选项。
为了方便,Pango标记语言提供了一系列的标签,它们代表文本的属性,形式上类似于HTML。用了这些标记语言,你可以在一个构件中为某段文本轻松地改变字体风格。当使用Glade User Interface Builder创建用户界面的时候,这点尤其有用,因为你可以在某个构件的文本内容区域里面直接输入标签。
在后面的章节中,我们有很多例子都会用到Pango,当我们需要修改构件字体的时候(不使用默认值)。使用PangoFontDescription对象或者Pango 标记语言都可以完成这项工作。
ATK 当设计一个软件的时候,需要考虑到一些身有残疾的用户,这点十分重要。因此,Accessbility Toolkit (ATK)为所有GTK+构件提供了内置的方法,来处理易用性问题。 ATK的一些例子添加了对屏幕读取的支持,还有显示高对比度主题的功能,这些都是为了方便视力有障碍的人士使用;键盘修改器,比如修改粘滞键,服务于行动不方便的人群。
尽管这部分对于设计一款软件产品十分重要,但是我就不在这里详细介绍了,以后会发一个单独的帖子加以介绍
当您准备在您的应用程序中处理ATK问题的时候,您应该时刻留意易用性的问题并且记得重新研究这个库,这点十分重要。



  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

前面几个小节大家都是大概了解就可以了,类似于大学里的思修课。。。我也参考了一些其他网上的内容,本节及以后都是很重要的知识,所以也都是原创的,内容我都尽量简洁,绝无废话(从现在开始)
1.4 基本概念
GObject
简单的说glib提供的C语言面向编程的一种方法,我在后面会提到用它实现一些自己的类
GtkWidget
所有gtk控件的父类
语言
能用于gtk的语言很多,主流的语言(前20)都可以,本教程用gtk最常用语言------C,以后会发一个python和c++的使用。
属性和方法
gtk中对象的属性和方法是只能通过函数来模拟的,所以函数的名称都比较长。属性就是比如说按钮的大小、外观、上面显示的内容等等。方法在gtk中主要就是访问各种属性的函数,例如一个显示文字的标签可以用gtk_label_set_text来设置上面的文字。
回调函数
gtk程序运行后就由gtk自动控制程序的运行了,所以要想在其中执行一定编程者事先想好的一些操作就需要通过回调函数来取得对程序的控制权,最常见的就是事件。
事件
一个控件在被用户进行操作后返回去执行一个函数,例如单击按钮就是一个事件,开发者可以将这个事件和自己定义的函数连接起来,这样单击按钮时就会执行指定的函数(一般是自己编写的)
glade
gtk程序用大量的语句来描述界面,将各种事件连接到相应的函数,代码冗长又不直观,所以就有了glade界面设计工具,它类似于visual studio或者delphi,可以设计所见即所得的界面以及连接事件与函数。不过它不提供编写代码的功能。一般是设计好界面后新建一个c文件,通过一定的代码取得这个界面并显示出来,后面我会专门介绍。虽然有了glade,但是熟练掌握普通的gtk代码编写也是很有必要的,因为属性都是通过各种函数来访问的,这些函数还是要掌握的。
主要就是这些概念,下次更新第二章


  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
继续更新~
第二章 第一节 Helloworld
这一小节就是编写一个最简单的gtk程序,一个窗体,标题是helloworld。
用任意一个文本编辑器写一个hello.c,内容如下:
#include<gtk/gtk.h>
int main(int argc,char *argv[])
{
GtkWidget
*window;
gtk_init(
&argc,&argv);
window
=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),
"helloworld");
gtk_widget_show(window);
gtk_main();

return 0;
}
那么如何编译这个程序呢?Linux下gtk2.0(如果用gtk3.0直接把2改成3就可以了):
  gcc hello.c -o hello `pkg-config --cflags --libs gtk+-2.0`
如果是windows下,则建议使用官方mingw中的msys,在msys下输入:
  gcc  `pkg-config --cflags gtk+-2.0` hello.c  `pkg-config --libs gtk+-2.0` -o hello.exe
运行的话就和普通的C语言程序是没有区别的,下一次会对这个程序以及编译的步骤进行详细的分析,还提出一些新的技巧。



2025-08-22 23:23:51
广告
不感兴趣
开通SVIP免广告
  • lzs1522975981
  • 核心吧友
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
太感谢了,因为我也初学gtk


  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第2章 第2节 如何编译
其实上一小节也简单说了一下编译,今天就具体分析一下这个程序,而且说一说高级一点的编译选项。
GtkWidget *window;
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"helloworld");
gtk_widget_show(window);
gtk_main();
首先,建立一个GtkWidget类型的指针。对于每一个gtk控件,都需要建立一个GtkWidget类型的指针。为什么是指针呢?因为C语言不是面向对象的,对于一个控件,它内部包含很多复杂的信息,例如一个窗体包括标题是什么,大小多少,位置在哪,包括计算机如何在屏幕上显示这个窗体,在窗体上单击最小化、关闭等按钮要进行什么操作等,要用一个struct来保存。为了表示各种各样的控件,就需要一个建立指针,为它动态的分配内存、动态的把它删除,而不能直接建立一个各种表示控件的struct,因为这样每次操作这个控件时,系统资源会消耗很大。而且,GTK只提供了对这种指针的初始化函数,如果你直接建立一个struct,就很难对它初始化。另外要注意的是一般都建立指向GtkWidget的指针而不是GtkWindow、或是GtkButton这类指针。
第二行是初始化gtk,这是所有gtk程序必须有的。
第三行就是一个初始化窗体语句,把这个窗体设置为顶层窗体。很少有情况下会设置为非顶层的窗体,即使是应用程序内部的小窗体也是顶层窗体,以后会介绍一个非顶层窗体的使用。
第四行是设置窗体的标题。使用过面向对象编程的朋友应该知道对于一个属性应该使用对应的方法来设置或读取,而不是直接访问属性,gtk也提供了相应的函数来访问属性。
第五行是显示窗体。
当一切准备工作做好后,就在第六行调用gtk_main()把控制权交给gtk,让gtk处理各种事件等等。当然,这个程序还没有设置事件。
严格来说,这个程序不算完整的程序,例如在windows下运行会发现关闭窗体后那个命令提示符窗体并没有关闭,也就是程序并没有退出,那么应该怎么办呢?
我们在gtk_main前面一行添加:
g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL);
然后在新建一个函数,
static void
destroy (GtkWidget *window,gpointer data)
{
gtk_main_quit ();
}
这样就可以在窗体关闭时退出程序了。
最后我们说一下编译的其他选项。所有gcc用到的选项在编译时都可以用,建议使用的是编译最终版本时加上-O1或-O2优化,然后就是建议使用-Wall,这样gcc会显示尽量详细的警告信息,对初学是很有帮助的,如果是windows版本可以加上-mwindows,这样从我的电脑里双击打开时就不会显示命令符窗口了,不过命令提示符中显示的一些程序的状态也就显示不了了。
这次就这么多,下次2.3



  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最近比较忙,不过我会尽量更新的


  • Ace_cm_liu
  • 铁杆吧友
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在网上找到很多都是关于这样的,请问怎么将C程序整合起来


  • 蓝猫呆呆
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
果然大神 持续关注


  • superprolog
  • 铁杆吧友
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
今天用手机更一下,最近都太忙了,对不起大家
2.3 信号,回调和事件
这一节主要是分析GTK+程序的执行原理。GTK+ 是依赖于Glib的,因为它用到了很多glib提供的特性,例如线程。一个gtk程序其实是由很多线程组成的(一般至少包括main函数那个线程和gtk_main线程。)每次同时执行的只有一个线程(一般来说都是gtk_main线程)。也就是说,执行一个gtk程序后,程序的控制权属于gtk,而不是程序员。那么如何才能人为对程序加以控制呢?这就需要使用信号(signal)。
每当gtk程序收到一个信号(例如一个按钮被单击了,或是过了一定的时间间隔),gtk会查找有没有对应的回调(callback),回调实际上是将一个函数封装进一个线程里。如果有回调,gtk就会把控制权交给这个回调,也就是调用这个函数。所以我们可以在这个函数里编写我们想进行的操作,例如前面变的destroy就是一个回调函数。我们可以通过g_signal_connect来连接信号和回调。
如前面的
g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL);

就是把destroy信号连接给destroy回调。注意两个destroy的不同,用字符串表示的那个是信号,这个是gtk预先定义好的,在这里表示窗体被销毁信号,必须用这个名字,而后面的destroy要和我们定义的函数同名,如果函数名改了,这个也要相应修改。
事件是一种特殊的信号,是指所有GtkWidget特有的一类回调,以后我们用到的回调基本都是事件。
最后我简单介绍一下GTK中对象的实现。其实这个特性也是glib实现的。大家应该都知道C语言是面向过程的,没有C++的面向对象功能,但是图形界面中一个按钮,一个菜单之类的都比较适合用面向对象的方法来实现,因为使用继承可以使开发大为简化。所以glib就采用了一种比较巧妙的方法来实现面向“对象”。
对于一个结构体A(前面说过,所有的控件都是结构体),如果想定义它的“属性”,那么只要直接放在A里面就行了,如
typedef struct _A{
int height
}A;
如果要定义方法,采用的方法就比较麻烦了,例如get_height方法就定义一个
int A_get_height(A *A1)方法,也就是它比真正的面向对象要多一个参数才可以。
如果要使用继承,例如B继承A,只要:
typedef struct _B{
A* A1,
int weight,
}B;
这个继承虽然比较难用,但确实是实现了。至于多态/多继承等特性,C语言就很难实现了,所以glib也没有实现。我们来了解一下gtk中最基本的几个控件的继承结构(都是单继承)
GObject ---> GtkWidget ---> GtkContainer ---> GtkWindow
GtkContainer表示一种容器,只能放置一个元素(可以放一个能放多个元素的元素来放多个元素)
终于把这些无聊的理论介绍的告一段落了,后面就要将用各种控件来编写从简单到复杂的gtk程序了^_^,敬请期待。最近我尽量一周一更。


2025-08-22 23:17:51
广告
不感兴趣
开通SVIP免广告
  • 蓝猫呆呆
  • 活跃吧友
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
额 就看完 写得很好 一看就懂 比那生涩的英文看得舒服多了 持续关注。。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 3 4 下一页 尾页
  • 101回复贴,共4页
  • ,跳到 页  
<<返回gtk吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示