LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 10272|回复: 36

《用Glade2开发图形用户界面》目录初译及其它(陆续加入..)

[复制链接]
发表于 2003-7-1 23:25:51 | 显示全部楼层 |阅读模式
用Glade2开发图形用户界面

作者: Rikke D. Giles
版权: 2003, Rikke D. Giles
Glade由Damon Chaplin编写

  1.    * 介绍:
  2.           o 什么是Glade?
  3.           o 哪里可以得到Glade?
  4.           o Glade如何使用?
  5.           o Glade能做什么不能做什么
  6.           o 基本术语
  7.     * Glade快速浏览
  8.           o Glade界面
  9.                 + 主窗口
  10.                 + 调色板窗口
  11.                 + 属性窗口
  12.                 + 控件树窗口
  13.           o Glade生成的文件
  14.                 + 保存一个工程时
  15.                 +联编一个工程时
  16.     *GUI: 一些需要考虑的事情
  17.           o 设计时需决定的事
  18.           o Gnome相关的设计
  19.           o KDE相关的设计
  20.           o 一致性
  21.           o 简洁
  22.     * 范例: GTemp
  23.           o 目标
  24.           o 创建GUI
  25.           o 创建第一个窗口
  26.           o 填满主程序窗口
  27.           o 加入随后一些的窗口
  28.           o 加入信号和回调函数
  29.     * 最后: 与GUI相互连接
  30.           o 库和APIS
  31.           o 控件附注
  32.           o 调出新窗口
  33.           o 当不再使用窗口时销毁它
  34.           o 下一步?
  35.     * 编写代码: Gtemp Redux
  36.           o 第一次编译
  37.           o 程序开始时只打开一个窗口
  38.           o 使Gtemp主窗口右上角的X图标起作用
  39.           o 使“退出”菜单项和“退出”按钮起作用
  40.           o 当选择“关于”菜单项调出“关于”窗口
  41.           o 使Gtemp能够转换温度值
  42.           o 此时,我们有一个可用的程序了
  43.           o 加入错误信息
  44.     * 控件的详细信息
  45.           o Gtk+基本控件
  46.           o Gtk+容器控件
  47.           o Gtk+附加的控件
  48.           o Gnome控件
  49.           o 不推荐使用的控件
  50.           o Glade1中有但Glade2中没有的控件
  51.     * 总结及资源
  52.     * 作者, 感谢, 版权
复制代码

英文版在http://glade.gnome.org
 楼主| 发表于 2003-7-2 12:49:21 | 显示全部楼层

介绍

介绍:
什么是Glade?
Glade用来为GTK+和GNOME程序快速地设计图形用户界面。如果安装了GTK+和/或GNOME库,也可用在Linux下任何桌面环境中。

哪里可以获得Glade?
Glade可以从glade.gnome.org上下载。它也在包含不同格式的所有Linux主要发行版中。到2003年4月,最新版本是1.1.3,它可能是Glade2.0之前最后的版本。

Glade如何使用?
Glade有两种使用方法:
用Glade创建GUI
用libglade打开*.glade文件(xml),创建GUI on the fly

Glade能做什么不能做什么:

Glade可以开发GUI界面及相关代码
它可以在程序的最后,创建连接到前端GUI的空的callbacks和signal。
Glade不能用来开发程序的内部代码
Glade不是一个完整IDE,换句话说它并不包含编译器,编辑器和调试器。 它可以连接这些程序,比如用gvim做为编辑器,gcc做为编译器以及gdb做为 调试器。Linux下有一些IDEs可以或即将可以与Glade协同工作,Anjuta就是其中一个。

基本术语:

前端/Gui: 在窗口环境下,用户能够看到及互动的图形界面。The 'eye candy'.
后端/内容: 程序中确实能干事情的部分,处理用户输入,提供输出,计算等。 基本上程序的这部分对用户是不可见的。
控件:用来创建窗口的几个或多个部件。简单的可以是一个标签,复杂的可以是 一个数据多叉树。
回调/信号处理器/信号: 控件针对特定的用户动作发出一个信号(比如,在窗口 右上角的"X"按下鼠标键)。信号处理器或回调是一个响应这个信号的函数。gtk_main()负责管 理它。对于Glade开发者来说,要做的就是告诉回调函数信号发生后做什么。注意这个并不象听上去那么简单。
发表于 2003-7-2 15:34:57 | 显示全部楼层
好啊!
 楼主| 发表于 2003-7-2 17:45:32 | 显示全部楼层

2.Glade快速浏览

用Glade2开发图形用户界面
作者: Rikke D. Giles, 版权 Rikke D. Giles 2003

Glade快速浏览
Glade界面
主窗口
主窗口如右图所示。在这里,你可以指定关于工程的选项,保存工程,打开工程 以及联编工程。它还包含有你所创建每个独立窗口的列表

"工程"菜单及"编辑"菜单含义比较明显。通过"查看"菜单你可以打开几个 窗口来查看工程的几个不同方面。Glade运行后自动打开调色板窗口和属性窗口。 同时打开控件树窗口会比较有用。

"设置"菜单能够改变Glade几个方面。可以尝试改一下看哪种你更喜欢。最后的 "帮助"菜单含义也明显。
  
  
  
调色板窗口
调色板包含了Glade可用的控件。共几页控件,可以点击'Gtk+ Basic'、 'Gtk+ Additional'、' Gnome'和'Deprecated'按钮来切换。"不推荐"页包含了 那些用的较少的控件,有老的Gtk1样式的"list and tree"控件以及不同的多余 Gnome控件。
根据Glade的安装,可能会发现其它可用的控件。如果Glade安装有定制控件, 调色板上就会有这些页。如果安装了Gnome-DB支持,就会有额外的"Gnome-DB"页

点击调色板上的控件就会选择它,然后再次点击你希望把它加入程序界面的位置。 必须先选一个窗口做为容纳其它控件的地方。

  
  
属性窗口
在属性窗口可以调节和设置程序里不同控件的属性。最少给每个主要输入/输出 控件一个名字。还可以设置缺省大小,确定能否编辑(如果它是一个文本类型 的控件), 确定是否能被鼠标点击,改变容器控件的大小及其它。你也可以设置每 个控件的标题和headers。
这个窗口有好几个标签页: Widget, Packing, Common, Signals and Accessibility (有国际通行的残疾人士标志)。每个标签页的细节根据控件类型有所不同,因而不再细说。 "Widget"标签页下可以设置控件的名称和基本外观。"acking"标签页能让控件在容器内 移动,以及设置当改变窗口尺寸时控件如何扩展和缩短。"Common"标签页可以设置更多的 的细节参数,比如如果你必须有一个固定尺寸的窗口及其它。"Signals"标签页很重要, 可以为每一个希望捕获的信号设置回调函数或信号处理器。"accessibility"标签页在 Glade2第一次出现,允许设置参数以符合GNOME易用指导方针。这会使人通过发音合成器 更容易使用你的程序,等等。
  
  
  
控件树窗口
在主窗口的"查看"菜单中可以找到控件树窗口。 它列出程序使用的所有控件,它们的名称和从属关系树。 右键点击树中的任何控件可以选择它,它的父控件,剪切、复制、删除等等。 如果程序需要重建,这样可以很简单地移动控件,而不需要重做名称、信号处理器、 尺寸选项等等。注意如果把控件从一个地方拷到另一个地方,新控件将有缺省的 名字和值。因为每一个控件必须有一个唯一的名字。
 楼主| 发表于 2003-7-2 21:04:57 | 显示全部楼层
用Glade2开发图形用户界面

作者: Rikke D. Giles, 版权 Rikke D. Giles 2003
Glade快速浏览: 第2页
Glade生成的文件
保存工程时

当你在glade主窗口按下保存时,glade将会在工程选项中指定的目录下保存两个文件。如果没有指定任何工程名字,glade将会保存在个人目录下面的/Projects子目录下。工程名为'Project#',#是一个数字,与你所建工程数量相关。给工程/程序命名时最好避免歧义。如果命名了工程,用你程序的名字替换下面的project#。

保存时创建的两个文件是:

    * Project1.glade
    * Project1.gladep

'Project1'是你选项中给出的名字,等等。

这两个文件含有xml代码,glade或libglade用来调出你所创的程序。如果联编了工程,*.glade文件将会被libglade调用。如果你想在程序中调用libglade 那就直接使用*.glade文件。
联编工程时

当按下主窗口的联编时,Glade产生用来生成程序GUI的所有文件。这些文件有时很难理解,特别是当你对Linux下编译程序了解很少的时候。下面会深入介绍它们。

    * 在 project# 目录
          o acconfig.h/autogen.sh/configure.in/Makefile.am/stamp-h.in
            这些文件是autoconf/autogen/automake系统所必须的,在Linux下这个系统 能够自动编译并检查库依赖性。通常Glade用户只需输入./autogen.sh来配置 他们的程序以及生成所需的Makefiles文件。如果工程需要一个特定的库, 这个库将会加入配置文件或生成的Makefiles文件中。
          o AUTHORS/ChangeLog/README/NEWS
            当程序发布将会用到这些文件。它们是标准分发文件,与具体的程序相关。
          o macros子目录
            这个子目录保存了autoconf和autogen等系统所需的宏。一定不要把它弄乱了。
          o po子目录
            存有po翻译文件。如果不用gettext来使你的程序国际化,就不用管它。
          o src 子目录
            看下面。
    * I在 project#/src 目录
          o main.c
            这个文件包含了main(), main()是所有C程序的初始化函数。只有当这个文件不存在 时Glade才创建,因此你可以随意编辑。当Glade第一次生成main.c文件时,它允许 显示所有创建的窗口。如果想在程序开始时只显示一个窗口需要编辑这个文件。
          o support.c
            包含glade支持函数,不能编辑。里面最有用的函数是lookup_widget(),允许通过另一个 控件的名字查找特定控件(假定它们在一个控件树中,比如在同一个窗口里等)。
          o callbacks.c
            有glade所写的所有回调函数和信号处理器。Glade不重写这个文件,不过当需要更多的 回调函数会向其中追加。Glade只写出了空的回调函数,需要你自己加入内容。
          o interface.c
            很象support.c,也不能编辑。Glade在里面写了生成GUI的函数。没有必要编辑它,如果编辑 过,下次联编程序时Glade又会重写。
          o Makefile.am/Makefile.in/Makefile
            这些文件由automake/autoconf包创建,为gcc编译程序提供指导。在这里可以加入包含的库、 新的资源文件等等。
 楼主| 发表于 2003-7-3 13:44:07 | 显示全部楼层
基本GUI
设计方案
输入/输出哪种数据?
每种数据是什么类型?
如何读入数据?
从磁盘
用户输入
从串口输入
等等
如何输出数据?
到文件
到屏幕
到串口
到数据库
等等
谁会使用这个程序?
作者:
如果设计的程序只是为自己使用,而不需要分发软件,你可以忽略一 大堆大多数软件所需要的错误处理、时钟和whistles及niceties。界面可以比较粗糙, 忽略所有相关的设计规范。
有特定技能的用户群:
设计错误处理时要考虑到用户的技能等等。比如, 针对专业技术人员软件可以更简洁,错误信息更直接等等。针对办公人员的软件则不能 这样。尽管对于特定用户普通的设计规范不太适用,但界面还是要很好地推敲。
普通用户:
应该有很多的错误处理,内容丰富并一致。界面应遵循所在窗口系统 的设计规范。尝试遵循易用的设计规范(下面有很多)。
程序是怎样的外观?
某些情况下,这是个人爱好的问题。
最大的功能也是最重要的。
Sticking within the guidelines/framework is important as well
如果可能,让它更直观一些。
如果你为其它人设计程序,让他们看一看,从技术和非技术的角度考虑一下。
Gnome特定的设计规范
Gnome程序有相应的设计规范, 它使桌面风格更统一,当然你可以不遵循它。也有易用的设计规范,如果 你的程序有残疾用户,这对你很重要。

KDE特定的设计规范
KDE同样也有设计标准。在这儿可以找到。.

一致性
程序里出现的东西、如何出现应保持一致,并与桌面环境设计规范保持一致。处理错误保持一致并遵循可预见的风格。显示数据也是如此。

简易
做为一个程序编写者,本能地使GUI跟着代码走。比如,当决定什么时,代码会包含一个分支。这个不需要用户知道,但代码必须这样来走,于是我们会把它包含在GUI里。尽量避免这样使事情复杂化。
 楼主| 发表于 2003-7-3 23:17:18 | 显示全部楼层
范例:用Glade2开发图形用户界面
目标

某个讲师很讨厌换算摄氏(Celsus)和华氏温度。于是她写一个程序帮她来做这件事。这个程序也可以做为许多Linux发行版中单位转换程序的不错的前端。(注意单位转换程序只能做直接的乘法转换(如线性的),而不能象 C到 F 或 F 到 C 的转换那样)

向这个程序输入一个 C或 F的数值,并转换成另一种单位。 It will do so without any other user input, but a carriage return.

如果输入的不是数字,会在程序状态栏上显示错误信息,这是唯一可预知的用户错误。
创建GUI
从主菜单的程序项目上选择Glade来启动(Redhat下)。

按'new'键,会弹出一个窗口询问是gtk工程还是gnome工程, 选择Gnome。这样可以使用易用的gnome控件,并至少满足gnome设计规范第一 部分的要求。


按glade主窗口的'options'键,会打开一个象右边那样的窗口。要注意几个 标签页,缺省是'general'页。清除工程目录里的"project1"部分,改为gtemp。 同时其它工程名称部分会自动改为gtemp。

根据需要改变source和pixmaps的子目录名,并选择想要的语言。Glade自带 C和C++,其它语言通过插件实现。转到C选项页。

在C选项页,关闭gettext支持。Gettext提供国际化支持,不过根据我的经验, 它导致Glade的auotgen和configur经常出问题。对于这个教程,我们不需要它。 其它选项不变。如果程序用到多个不同的glade文件,最好根据需要改变一下。

检查libglade页。这个页允许保存供翻译用的字符串,这对国际化程序很重要。 对于本范例不用改变它的。
Glade Options

建立第一个窗口
Gtemp's main window, under Glade

转到Glade的调色板,按"Gnome"切换到gnome控件页,点击左上角第一个控件。 这个是gnome程序窗口控件。它会建立一个空的窗口,带有所有标准的gnome菜单、 工具条和其它。这个控件应该是左图那个样子。

在属性窗口,当选择程序窗口控件时,把它的名字改为'gtemp_app'。其它地方不变。

你可以浏览菜单上的菜单项及查看工具条的按钮。Gtemp程序很简单,不需要其它大 多数选项。实际上,目前的设计中只会用到文件菜单下的"退出",帮助菜单,还需要在 在工具条上有一个"退出"按钮。没有什么要保存,因为结果会立即显示在窗口里。也没 有文件需要打开,因为直接在窗口里输入。没有什么要编辑和查看..。因此我们将去掉 那些永远不会用到的命令,设置为不响应。(不活动/灰色)。如果后面要用的话,会把 它们设为活动状态。


首先高亮(点击)工具条。那些系统按钮(New, Open和Save)在长方形的部分里。 属性窗口显示名字为"toolbar1"。注意工具条的尺寸设为3。我们只需要一个按钮, 一个"退出"按钮,把尺寸设为1,这时工具条上只有一个"新建"按钮。现在,高亮 (点击)"新建"按钮。属性窗口中名字应该是'button1',把名字改为'quit_button'。向下 找到系统按钮选择,点向下的箭头,会打开一个系统按钮选择菜单,选择"退出" 图标。设置按钮边缘宽度,5或3看上去不错。点主窗口"保存"保存已做的工作。


现在回到gtemp程序窗口,点'文件'菜单,菜单条会高亮显示,属性窗口显示 'menubar1'。在属性窗口里点编辑按钮,出一个象右边一样的新窗口-菜单编辑 器。

注意菜单条与菜单编辑器的布局及书写方式一致。'文件'是菜单条的第一项。 点击它打开一个子菜单,列有'new', 'open', 'save', 'save as', 菜单分割线和'quit'。 我们只需要'退出'。选择不需要的项目,点击右边的删除键去掉它们。

"编辑"菜单中有一些是我们需要的。不过后面还可能加入"偏好"和"属性",现 在就不改动了。Delete everything ele under 'edit'.点击"应用",回到gtemp程序窗口 看一下刚才工作的结果。

我们完全不需要"查看"项,删掉它。保留帮助菜单和'about'项,因为将会放入 一个"About"弹出窗口。每个人创造的东西应该受到表扬。
The Glade Menu Editor

对gtemp程序窗口还要做另一个更改。我们不需要进度条,不过状态 条可以用来显示信息。选择窗口的中状态条。它的名字是'appbar1',愿意的话改个 名字,通常没有必要因为程序中只有一个状态条,而且这种情况下它的系统名称不 不引起混淆。在属性窗口,设置'progress'为'no'。

完成后gtemp程序窗口应该象左图那样。我们还没有设置数据及程序应该做什么, 不过希望你已经学会了如何调出菜单编辑器,通过属性窗口如何设置一些参数, 以及在glade中自由浏览。如果你对所做的不满意,可以备份每次glade保存所写的 *.glade文件,或重新载入程序,或从头开始。
 楼主| 发表于 2003-7-4 13:46:54 | 显示全部楼层
Gtemp:用Glade创建界面的范例
填充主程序窗口
象任何程序一样,在Gtemp中有很多种方法来检查和显示数据。 present the data in Gtemp. 我们可以在"edit"菜单->properties下设 一人菜单,让用户选择是从 C 转换到 F ,还是从 F 转换到 C 。可以在主 窗口下设置选项菜单让用户选择是哪种转换。另一个方法更有用些,它只需要 很少的几步就能得到正确结果。这个方法还可以扩展,这样我们能加入英里转 公里、公里转英里等等。不过,这个程序我们只做温度单位的转换。输入数据 最简单的方法是从一个文本框里获得。在C文本框里输入数值,就是从C转换到F。 在F文本框里输入数值,就是从F转换到C。没有用到的文本框返回结果。

我们需要两个温度单位标签,两个输入/结果的文本框。不需要设个按钮来 开始运算,在文本框按下回车键就会发出信号来开始。

  
每个窗口组件象文本框和标签需要放到容器里。现在,gtemp程序中空窗口就 是一个容器,不过它只能放入一个控件,因此我们需要在其中放入一个容器控件。 可以横向或纵向盒子容器,不过表容器更适合些。

在调色板里选择gtk+基本,点表容器控件。它在第7行从右数第2个。样子象:

在gtemp窗口,点空阴影部分。会弹出一个窗口,询问表有多少行和列。设行和 列为2,因为我们需要两个标签和两个文本框。如果需要后面可以在属性窗口中改变 它。gtemp窗口看上去应该象右图那样。
  
  
  
现在加入标签。点调色板的标签控件,它在gtk+ basic页下,第2行第1个控件, 样子是。点gtemp程序窗口中表的左上 角部分,标签放进窗口,名字叫'label1'。

在属性窗口把标签的名字改为fahr_label。标签内容改为'Fahrenheit'。它看 上去好象被压扁了,是不是?让我们扩展一下。在标签的属性菜单的主页面上有 X和Y排列文本框。把它们从0改为5。现在标签看上去好看些了。

创建另一个标签,放在表的右上角。名字叫做cel_label,内容为'Celsius'。 把它的排列改成与fahr_label一致。gtemp程序窗口看上去象左图那样。

  
  
下一步加入文本框控件。调色板中选择文本框控件。它在第2行每2列,样子是 。在gtemp程序 窗口点表的右下角放入文本框控件。

这个控件还需要改名并排列。改名为'fahr_entry',切换到属性窗口的第2页 (packing),设 h padding 和 v padding 为5。在这页点"yes"按钮,关闭 x expand属性。

表的右下角加入另一个文本框,名字是'cel_entry',排列改为跟上面那个一 样,记住关闭 x expand属性。

glade窗口按"save"保存你的工作。看上去应该是右图那样。
  
  
  
调整一下窗口,拖窗口的角来扩大和缩小窗口。你可能不喜欢它扩大和缩小、或 是它的样子。这4个我们需要的小控件占了很大的地方。你可以在属性窗口设置所有 控件的排列和扩展属性,包括容器控件。作者喜欢表的边设为5,打开homogenous 属性。可能你喜欢另一种外观。

本节学会了如何在容器控件里放入控件,如何设置排列和扩展属性,以及如何 设置控件的名字。你应该很熟悉属性窗口。你可以在控件上点右键来选择同一个父, as well as 控件树上的其它控件,并可以复印、剪切、粘贴或删除。
 楼主| 发表于 2003-7-4 17:16:02 | 显示全部楼层

下午不想干活,多译一点:)

Gtemp: 用Glade创建界面的范例
加下一个窗口
Gtemp程序用状态条来显示错误信息,因此不需要弹出的对话框或错误窗口。 不过,需要一个"关于"窗口,下一步我们加入它。

我们可以从gtk+基本控件中创建这个窗口,不过既然我们已创建了一个glade程 序,就用glade的"关于"控件来代替。在调色板窗口点gnome按钮进入gnome控件页。 选择第1行第2列的'gnome about dialog'控件,这会创建一个"关于"窗口。

在属性窗口改名为gtemp_about。gtemp没有图标或标识,就让它们空着。 把想写的内容加入到版权和作者窗口。记住,初版gtemp由Rikke D. Giles编写, 做为一个教程练习。原始的版权是GNU copyleft。完成后看上去如右图。
  
  
  
加入信号和回调函数
作者趋向于立刻加入全部信号处理同时进行后端编程。 Gtemp只有很少几个信号,现在我们开始加入它们。点击窗口右上角的x关闭"关于" 对话框。注意"关于"对话框已经加入到glade主窗口的控件列表中。

在gtemp程序窗口点退出按钮,在属性窗口会显示它的属性。点signals页,来 设置signals页。信号文本框旁边是一个标有"..."的按钮,点它会出现这个控件 信号的列表。信号根据控件的不同而不同,不过所有控件通常都有一些基本的信号, 因为它们都是GtkWidget和GtkContainer的子类。对于退出按钮,在GtkButton信号 中选择'clicked',点OK,弹出的信号列表会消失。这个信号及句柄已写入正确的 文本框内。点击"add",这个信号句柄会加入到信号句柄的列表中。加入一个信号 就是这么简单。

菜单编辑器已经自动地加入信号,因此我们不需要对gtemp中的主菜单做任何事 情。不过,我们需要捕获当文本框使用时的活动信号。高亮fahr_entry控件。属性 窗口还显示在signals页,点"..."键,从GtkEntry信号中选择"activate"。右图是 这个列表。注意它如何从按钮控件变化的。选择"activate"后,点击"ok"再点击 "add"把信号加入信号句柄列表中。对cel_entry控件做同样的工作。这是目前gtemp 所需加入的所有信号。

"关于"窗口有什么信号呢? 由于这是一个系统gnome对话框,已经设好了信号句 柄。我们没有理由去动它们,除非想要做的与系统设置的不同(为什么要这样?)。
 楼主| 发表于 2003-7-5 14:25:52 | 显示全部楼层
后端: 与GUI互动
库和API
当编写GTK+和GNOME程序时,需要注意几个不同的库和工具。以下是它们的列表,并带有简短的介绍。

Glib:
Glib提供了一些函数,用来替代基本的C函数特别是具有缓冲区溢出 危险的函数。如果你正在进行gnu,gtk+和gnome程序的编写,Glib很值得学习。基本API在这里。许多先进 的控件,比如列表和选项菜单用到了Glib中的链表,这也是需要熟悉它的另一个原因。
GDK:
GDK是一个基本的库,把GTK和窗口系统的细节隔离开。它面对窗口管 理器,比如metacity, sawfish或其它东西。它提供了很基本的画图工具及可能用在 callbacks.c里的函数,大多数函数用来隐藏和扩大窗口。API在这里。
Gtk+:
Gtk+是Gimp工具箱。版本1.* 与版本2.*不一致。Glade2使用2.*, Glade使用1.*。这个教程使用Gtk2。你可以在这里找到这些 API。Gtk+很重要,它提供了为Gtk+控件改变属性、捕获信号、获得并放置数据等等的所有 函数。每个控件及其相关函数在API有描述,这是用Glade编程的主要参考手册。
Libgnome和libgnomeui:
这些库包含了额外的gnome库。 如果你用glade开发gnome程序,需要安装它们。我们用在gtemp中的gnome控件也在这些库 里,APIs提供了使用这些控件的细节。查看libgnome文档 和libgnomeui文档。
Libglade:
glade用Libglade从*.glade文件中创建代码。 开发者可以用来做同样的事,载入一个*.glade xml文件来创建界面代码。参考手册在这里。
其它库:
还有一些可用的其它库,是gnome/gtk系统的一部分。 它们的API在gnome.org网站上的gnome开发者站点。
指向控件
连接后端和GUI仅仅是显示和接收来自控件的数据。上面提到的Gtk+和Gnome库文件为每一个控件提供函数,允许你设置和获取数据。不过有时在程序中你还是要指向控件。

最简单的方法是使用Glade在support.c里提供的lookup_widget()函数。这个函数以一个控件和控件名字做参数,返回所要的控件(如果它在参数控件的树里)。 例如,Gtemp界面里创建了一个控件叫做fahr_entry,它在主程序窗口树中。 如果我们正在处理fahr_entry的一个活动回调函数,不过想找到控件 cel_entry,把数据放进去,可以用 GtkWidget *cel_entry = lookup_widget(GTK_WIDGET(fahr_entry), "cel_entry")。这个看上去有点糊涂,不过基本上它是一个声明为GtkWidget类型 (cel_entry)的指针,与控件自己指的是同样一个东西。

另一个指向一个控件的方法是使用gtk_widget_get_toplevel()。参数是子控件。例如,找出cel_entry最上层的容器控件(通常是gtemp程序窗口)可以这样做 ... GtkWidget *gtemp_app = gtk_widget_get_toplevel(GTK_WIDGET(cel_entry));.

你也可以使用静态或全局变量来联系控件。经常这是从子窗口(如弹出窗口和对话框)指向主窗口是最简单的方法。不过,使用太多的全局变局会被认为是糟糕的编码,鼓励限制使用这它们。如果我们使用gtemp_app做为一个全局变量,并在main.c里实现它,那么在callbacks.c或其它需要用到的地方中把它声明为外部变量。从这个角度, Gtemp不需要做这些。

Glib提供了一种方法,可以将任何g_object和gtk+对象关联到一个关键字符串上。注意Gtk+小于2.0时,有一个gtk_object类,现在包含在g_object下。任何时候你可以使用指向设在一个对象上的数据。例如,这段代码设置一个指向cel_entry的标志并连接到fahr_entry。
static gchar *my_key_string = "my_key_string";

cel_entry = lookup_widget(GTK_WIDGET(fahr_entry), "cel_entry");
g_object_set_data(G_OBJECT(fahr_entry), my_key_string, cel_entry);

程序的后面我们可以直接从fahr_entry获得cel_entry :
GtkWidget *cel_entry;

cel_entry = g_object_get_data(G_OBJECT(fahr_entry), my_key_string);

当然, 当指向的控件在同一个控件树中(如它们在同一个窗口)这个方法不太有用处。 lookup_widget函数会更好些。不过,这个技术很适合从一个窗口指向另一个窗口,而且不会用到全局变量。这样你可以从一个弹出窗口获得数据并输入到主窗口,比如不需要使主窗口全局化。

调出新窗口或菜单
Glade在interface.c里写入每个设计出来的窗口或弹出菜单的创建函数。 通常使用这些函数没有必要编辑interface.c文件。这些函数叫做create_windowname(), 没有参数,返回一个指向实际窗口或弹出菜单控件的指针。例如,下面这段代码为 Gtemp创建"关于"窗口:
GtkWidget *about;

about = create_gtemp_about();

是,就是这么简单。

当窗口不再使用时销毁它
如果你已经创建了一个弹出窗口或对话框,再也不会用到它,你可以用gtk_widget_destroy() 销毁它。参数是想要销毁的GtkWidget。通常这个函数会被要销毁窗口的"ok"或"cancel"键调用。例如,从一个名叫'which_file'的弹出窗口上的"ok"按钮销毁这个窗口,只需要在这个按钮的回调函数中调用上面那个函数。:
gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(ok_button)));

注意我们没有把这个按钮自己传入这个函数,这只会销毁这个按钮。我们 把按钮的上层父控件(窗口)传入函数。

下一步?
现在你知道了库的参考手册在哪儿,如何指向程序中的控件,是时候转向编写代码了。程序的内容通常包含收到数据如何处理,或显示之前如何处理。Glade这方面不做任何事情, 程序开发变成了一个编码问题,而不是一个界面问题。想知道一个简单的界面如何连接到一个一个简单的后端,我们将转入到Gtemp程序。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表