亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 用Glade2開發(fā)圖形用戶界面 [打印本頁]

作者: bitmilong    時間: 2005-11-24 19:00
標題: 用Glade2開發(fā)圖形用戶界面
用Glade2開發(fā)圖形用戶界面
http://www.gd-linux.org/bbs/show ... amp;p=4126#post4126
--------------------------------------------------------------------------------
如果你不想看這個文本模式的文章,你可以下載本貼下面的附件的html文檔 (下載后請用tar jxvf glade2-devel.tar.bz2 解壓)
http://blog.chinaunix.net/resserver.php?blogId=6198&resource=glade2-devel.tar.bz2

用Glade2開發(fā)圖形用戶界面

作者: Rikke D. Giles 版權(quán): 2003, Rikke D. Giles
Glade由Damon Chaplin編寫 感謝hulihutu翻譯



源碼:
* 介紹:
o 什么是Glade?
o 哪里可以得到Glade?
o Glade如何使用?
o Glade能做什么不能做什么
o 基本術(shù)語
* Glade快速瀏覽
o Glade界面
+ 主窗口
+ 調(diào)色板窗口
+ 屬性窗口
+ 控件樹窗口
o Glade生成的文件
+ 保存一個工程時
+聯(lián)編一個工程時
*GUI: 一些需要考慮的事情
o 設(shè)計時需決定的事
o Gnome相關(guān)的設(shè)計
o KDE相關(guān)的設(shè)計
o 一致性
o 簡潔
* 范例: GTemp
o 目標
o 創(chuàng)建GUI
o 創(chuàng)建第一個窗口
o 填滿主程序窗口
o 加入隨后一些的窗口
o 加入信號和回調(diào)函數(shù)
* 最后: 與GUI相互連接
o 庫和APIS
o 控件附注
o 調(diào)出新窗口
o 當不再使用窗口時銷毀它
o 下一步?
* 編寫代碼: Gtemp Redux
o 第一次編譯
o 程序開始時只打開一個窗口
o 使Gtemp主窗口右上角的X圖標起作用
o 使“退出”菜單項和“退出”按鈕起作用
o 當選擇“關(guān)于”菜單項調(diào)出“關(guān)于”窗口
o 使Gtemp能夠轉(zhuǎn)換溫度值
o 此時,我們有一個可用的程序了
o 加入錯誤信息
* 控件的詳細信息
o Gtk+基本控件
o Gtk+容器控件
o Gtk+附加的控件
o Gnome控件
o 不推薦使用的控件
o Glade1中有但Glade2中沒有的控件
* 總結(jié)及資源
* 作者, 感謝, 版權(quán)


英文版在http://glade.gnome.org




介紹

介紹:
什么是Glade?
Glade用來為GTK+和GNOME程序快速地設(shè)計圖形用戶界面。如果安裝了GTK+和/或GNOME庫,也可用在Linux下任何桌面環(huán)境中。

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

Glade如何使用?
Glade有兩種使用方法:
用Glade創(chuàng)建GUI
用libglade打開*.glade文件(xml),創(chuàng)建GUI on the fly

Glade能做什么不能做什么:

Glade可以開發(fā)GUI界面及相關(guān)代碼
它可以在程序的最后,創(chuàng)建連接到前端GUI的空的callbacks和signal。
Glade不能用來開發(fā)程序的內(nèi)部代碼
Glade不是一個完整IDE,換句話說它并不包含編譯器,編輯器和調(diào)試器。 它可以連接這些程序,比如用gvim做為編輯器,gcc做為編譯器以及gdb做為 調(diào)試器。Linux下有一些IDEs可以或即將可以與Glade協(xié)同工作,Anjuta就是其中一個。

基本術(shù)語:

前端/Gui: 在窗口環(huán)境下,用戶能夠看到及互動的圖形界面。The 'eye candy'.
后端/內(nèi)容: 程序中確實能干事情的部分,處理用戶輸入,提供輸出,計算等。 基本上程序的這部分對用戶是不可見的。
控件:用來創(chuàng)建窗口的幾個或多個部件。簡單的可以是一個標簽,復(fù)雜的可以是 一個數(shù)據(jù)多叉樹。
回調(diào)/信號處理器/信號: 控件針對特定的用戶動作發(fā)出一個信號(比如,在窗口右上角的"X"按下鼠標鍵)。信號處理器或回調(diào)是一個響應(yīng)這個信號的函數(shù)。gtk_main()負責管理它。對于Glade開發(fā)者來說,要做的就是告訴回調(diào)函數(shù)信號發(fā)生后做什么。注意這個并不象聽上去那么簡單。




2.Glade快速瀏覽

用Glade2開發(fā)圖形用戶界面
作者: Rikke D. Giles, 版權(quán) Rikke D. Giles 2003

Glade快速瀏覽
Glade界面
主窗口
主窗口如右圖所示。在這里,你可以指定關(guān)于工程的選項,保存工程,打開工程 以及聯(lián)編工程。它還包含有你所創(chuàng)建每個獨立窗口的列表

"工程"菜單及"編輯"菜單含義比較明顯。通過"查看"菜單你可以打開幾個 窗口來查看工程的幾個不同方面。Glade運行后自動打開調(diào)色板窗口和屬性窗口。 同時打開控件樹窗口會比較有用。

"設(shè)置"菜單能夠改變Glade幾個方面?梢試L試改一下看哪種你更喜歡。最后的 "幫助"菜單含義也明顯。

調(diào)色板窗口
調(diào)色板包含了Glade可用的控件。共幾頁控件,可以點擊'Gtk+ Basic'、 'Gtk+ Additional'、' Gnome'和'Deprecated'按鈕來切換。"不推薦"頁包含了 那些用的較少的控件,有老的Gtk1樣式的"list and tree"控件以及不同的多余 Gnome控件。
根據(jù)Glade的安裝,可能會發(fā)現(xiàn)其它可用的控件。如果Glade安裝有定制控件, 調(diào)色板上就會有這些頁。如果安裝了Gnome-DB支持,就會有額外的"Gnome-DB"頁

點擊調(diào)色板上的控件就會選擇它,然后再次點擊你希望把它加入程序界面的位置。 必須先選一個窗口做為容納其它控件的地方。

屬性窗口
在屬性窗口可以調(diào)節(jié)和設(shè)置程序里不同控件的屬性。最少給每個主要輸入/輸出 控件一個名字。還可以設(shè)置缺省大小,確定能否編輯(如果它是一個文本類型 的控件), 確定是否能被鼠標點擊,改變?nèi)萜骺丶拇笮〖捌渌。你也可以設(shè)置每 個控件的標題和headers。
這個窗口有好幾個標簽頁: Widget, Packing, Common, Signals and Accessibility (有國際通行的殘疾人士標志)。每個標簽頁的細節(jié)根據(jù)控件類型有所不同,因而不再細說。 "Widget"標簽頁下可以設(shè)置控件的名稱和基本外觀。"Packing"標簽頁能讓控件在容器內(nèi)移動,以及設(shè)置當改變窗口尺寸時控件如何擴展和縮短。 "Common"標簽頁可以設(shè)置更多的的細節(jié)參數(shù),比如如果你必須有一個固定尺寸的窗口及其它。"Signals"標簽頁很重要,可以為每一個希望捕獲的信號設(shè)置回調(diào)函數(shù)或信號處理器。"accessibility"標簽頁在 Glade2第一次出現(xiàn),允許設(shè)置參數(shù)以符合GNOME易用指導方針。這會使人通過發(fā)音合成器 更容易使用你的程序,等等。

控件樹窗口
在主窗口的"查看"菜單中可以找到控件樹窗口。它列出程序使用的所有控件,它們的名稱和從屬關(guān)系樹。右鍵點擊樹中的任何控件可以選擇它,它的父控件,剪切、復(fù)制、刪除等等。如果程序需要重建,這樣可以很簡單地移動控件,而不需要重做名稱、信號處理器、尺寸選項等等。注意如果把控件從一個地方拷到另一個地方,新控件將有缺省的名字和值。因為每一個控件必須有一個唯一的名字。



用Glade2開發(fā)圖形用戶界面

作者: Rikke D. Giles, 版權(quán) Rikke D. Giles 2003
Glade快速瀏覽: 第2頁
Glade生成的文件
保存工程時

當你在glade主窗口按下保存時,glade將會在工程選項中指定的目錄下保存兩個文件。如果沒有指定任何工程名字,glade將會保存在個人目錄下面的/Projects子目錄下。工程名為'Project#',#是一個數(shù)字,與你所建工程數(shù)量相關(guān)。給工程/程序命名時最好避免歧義。如果命名了工程,用你程序的名字替換下面的project#。

保存時創(chuàng)建的兩個文件是:

* Project1.glade
* Project1.gladep

'Project1'是你選項中給出的名字,等等。

這兩個文件含有xml代碼,glade或libglade用來調(diào)出你所創(chuàng)的程序。如果聯(lián)編了工程,*.glade文件將會被libglade調(diào)用。如果你想在程序中調(diào)用libglade 那就直接使用*.glade文件。
聯(lián)編工程時

當按下主窗口的聯(lián)編時,Glade產(chǎn)生用來生成程序GUI的所有文件。這些文件有時很難理解,特別是當你對Linux下編譯程序了解很少的時候。下面會深入介紹它們。

* 在 project# 目錄
o acconfig.h/autogen.sh/configure.in/Makefile.am/stamp-h.in
這些文件是autoconf/autogen/automake系統(tǒng)所必須的,在Linux下這個系統(tǒng)能夠自動編譯并檢查庫依賴性。通常Glade用戶只需輸入./autogen.sh來配置他們的程序以及生成所需的Makefiles文件。如果工程需要一個特定的庫,這個庫將會加入配置文件或生成的Makefiles文件中。
o AUTHORS/ChangeLog/README/NEWS
當程序發(fā)布將會用到這些文件。它們是標準分發(fā)文件,與具體的程序相關(guān)。
o macros子目錄
這個子目錄保存了autoconf和autogen等系統(tǒng)所需的宏。一定不要把它弄亂了。
o po子目錄
存有po翻譯文件。如果不用gettext來使你的程序國際化,就不用管它。
o src 子目錄
看下面。
* I在 project#/src 目錄
o main.c
這個文件包含了main(), main()是所有C程序的初始化函數(shù)。只有當這個文件不存在時Glade才創(chuàng)建,因此你可以隨意編輯。當Glade第一次生成main.c文件時,它允許顯示所有創(chuàng)建的窗口。如果想在程序開始時只顯示一個窗口需要編輯這個文件。
o support.c
包含glade支持函數(shù),不能編輯。里面最有用的函數(shù)是lookup_widget(),允許通過另一個 控件的名字查找特定控件(假定它們在一個控件樹中,比如在同一個窗口里等)。
o callbacks.c
有g(shù)lade所寫的所有回調(diào)函數(shù)和信號處理器。Glade不重寫這個文件,不過當需要更多的 回調(diào)函數(shù)會向其中追加。Glade只寫出了空的回調(diào)函數(shù),需要你自己加入內(nèi)容。
o interface.c
很象support.c,也不能編輯。Glade在里面寫了生成GUI的函數(shù)。沒有必要編輯它,如果編輯 過,下次聯(lián)編程序時Glade又會重寫。
o Makefile.am/Makefile.in/Makefile
這些文件由automake/autoconf包創(chuàng)建,為gcc編譯程序提供指導。在這里可以加入包含的庫、 新的資源文件等等。
作者: bitmilong    時間: 2005-11-24 19:01
基本GUI
設(shè)計方案
輸入/輸出哪種數(shù)據(jù)?
每種數(shù)據(jù)是什么類型?
如何讀入數(shù)據(jù)?
從磁盤
用戶輸入
從串口輸入
等等
如何輸出數(shù)據(jù)?
到文件
到屏幕
到串口
到數(shù)據(jù)庫
等等
誰會使用這個程序?
作者:
如果設(shè)計的程序只是為自己使用,而不需要分發(fā)軟件,你可以忽略一 大堆大多數(shù)軟件所需要的錯誤處理、時鐘和whistles及niceties。界面可以比較粗糙, 忽略所有相關(guān)的設(shè)計規(guī)范。
有特定技能的用戶群:
設(shè)計錯誤處理時要考慮到用戶的技能等等。比如, 針對專業(yè)技術(shù)人員軟件可以更簡潔,錯誤信息更直接等等。針對辦公人員的軟件則不能 這樣。盡管對于特定用戶普通的設(shè)計規(guī)范不太適用,但界面還是要很好地推敲。
普通用戶:
應(yīng)該有很多的錯誤處理,內(nèi)容豐富并一致。界面應(yīng)遵循所在窗口系統(tǒng) 的設(shè)計規(guī)范。嘗試遵循易用的設(shè)計規(guī)范(下面有很多)。
程序是怎樣的外觀?
某些情況下,這是個人愛好的問題。
最大的功能也是最重要的。
Sticking within the guidelines/framework is important as well
如果可能,讓它更直觀一些。
如果你為其它人設(shè)計程序,讓他們看一看,從技術(shù)和非技術(shù)的角度考慮一下。
Gnome特定的設(shè)計規(guī)范
Gnome程序有相應(yīng)的設(shè)計規(guī)范, 它使桌面風格更統(tǒng)一,當然你可以不遵循它。也有易用的設(shè)計規(guī)范,如果 你的程序有殘疾用戶,這對你很重要。

KDE特定的設(shè)計規(guī)范
KDE同樣也有設(shè)計標準。在這兒可以找到。.

一致性
程序里出現(xiàn)的東西、如何出現(xiàn)應(yīng)保持一致,并與桌面環(huán)境設(shè)計規(guī)范保持一致。處理錯誤保持一致并遵循可預(yù)見的風格。顯示數(shù)據(jù)也是如此。

簡易
做為一個程序編寫者,本能地使GUI跟著代碼走。比如,當決定什么時,代碼會包含一個分支。這個不需要用戶知道,但代碼必須這樣來走,于是我們會把它包含在GUI里。盡量避免這樣使事情復(fù)雜化。



范例:用Glade2開發(fā)圖形用戶界面
目標

某個講師很討厭換算攝氏(Celsus)和華氏溫度。于是她寫一個程序幫她來做這件事。這個程序也可以做為許多Linux發(fā)行版中單位轉(zhuǎn)換程序的不錯的前端。(注意單位轉(zhuǎn)換程序只能做直接的乘法轉(zhuǎn)換(如線性的),而不能象 C到 F 或 F 到 C 的轉(zhuǎn)換那樣)

向這個程序輸入一個 C或 F的數(shù)值,并轉(zhuǎn)換成另一種單位。 It will do so without any other user input, but a carriage return.

如果輸入的不是數(shù)字,會在程序狀態(tài)欄上顯示錯誤信息,這是唯一可預(yù)知的用戶錯誤。
創(chuàng)建GUI
從主菜單的程序項目上選擇Glade來啟動(Redhat下)。

按'new'鍵,會彈出一個窗口詢問是gtk工程還是gnome工程, 選擇Gnome。這樣可以使用易用的gnome控件,并至少滿足gnome設(shè)計規(guī)范第一 部分的要求。


按glade主窗口的'options'鍵,會打開一個象右邊那樣的窗口。要注意幾個 標簽頁,缺省是'general'頁。清除工程目錄里的"project1"部分,改為gtemp。 同時其它工程名稱部分會自動改為gtemp。

根據(jù)需要改變source和pixmaps的子目錄名,并選擇想要的語言。Glade自帶 C和C++,其它語言通過插件實現(xiàn)。轉(zhuǎn)到C選項頁。

在C選項頁,關(guān)閉gettext支持。Gettext提供國際化支持,不過根據(jù)我的經(jīng)驗, 它導致Glade的auotgen和configur經(jīng)常出問題。對于這個教程,我們不需要它。 其它選項不變。如果程序用到多個不同的glade文件,最好根據(jù)需要改變一下。

檢查libglade頁。這個頁允許保存供翻譯用的字符串,這對國際化程序很重要。 對于本范例不用改變它的。
Glade Options

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

轉(zhuǎn)到Glade的調(diào)色板,按"Gnome"切換到gnome控件頁,點擊左上角第一個控件。 這個是gnome程序窗口控件。它會建立一個空的窗口,帶有所有標準的gnome菜單、 工具條和其它。這個控件應(yīng)該是左圖那個樣子。

在屬性窗口,當選擇程序窗口控件時,把它的名字改為'gtemp_app'。其它地方不變。

你可以瀏覽菜單上的菜單項及查看工具條的按鈕。Gtemp程序很簡單,不需要其它大多數(shù)選項。實際上,目前的設(shè)計中只會用到文件菜單下的"退出",幫助菜單,還需要在在工具條上有一個"退出"按鈕。沒有什么要保存,因為結(jié)果會立即顯示在窗口里。也沒有文件需要打開,因為直接在窗口里輸入。沒有什么要編輯和查看..。因此我們將去掉那些永遠不會用到的命令,設(shè)置為不響應(yīng)。(不活動/灰色)。如果后面要用的話,會把 它們設(shè)為活動狀態(tài)。


首先高亮(點擊)工具條。那些系統(tǒng)按鈕(New, Open和Save)在長方形的部分里。屬性窗口顯示名字為"toolbar1"。注意工具條的尺寸設(shè)為3。我們只需要一個按鈕,一個"退出"按鈕,把尺寸設(shè)為1,這時工具條上只有一個"新建"按鈕。現(xiàn)在,高亮 (點擊)"新建"按鈕。屬性窗口中名字應(yīng)該是'button1',把名字改為'quit_button'。向下找到系統(tǒng)按鈕選擇,點向下的箭頭,會打開一個系統(tǒng)按鈕選擇菜單,選擇"退出" 圖標。設(shè)置按鈕邊緣寬度,5或3看上去不錯。點主窗口"保存"保存已做的工作。


現(xiàn)在回到gtemp程序窗口,點'文件'菜單,菜單條會高亮顯示,屬性窗口顯示 'menubar1'。在屬性窗口里點編輯按鈕,出一個象右邊一樣的新窗口-菜單編輯 器。

注意菜單條與菜單編輯器的布局及書寫方式一致。'文件'是菜單條的第一項。 點擊它打開一個子菜單,列有'new', 'open', 'save', 'save as', 菜單分割線和'quit'。 我們只需要'退出'。選擇不需要的項目,點擊右邊的刪除鍵去掉它們。

"編輯"菜單中有一些是我們需要的。不過后面還可能加入"偏好"和"屬性",現(xiàn) 在就不改動了。Delete everything ele under 'edit'.點擊"應(yīng)用",回到gtemp程序窗口 看一下剛才工作的結(jié)果。

我們完全不需要"查看"項,刪掉它。保留幫助菜單和'about'項,因為將會放入 一個"About"彈出窗口。每個人創(chuàng)造的東西應(yīng)該受到表揚。
The Glade Menu Editor

對gtemp程序窗口還要做另一個更改。我們不需要進度條,不過狀態(tài)條可以用來顯示信息。選擇窗口的中狀態(tài)條。它的名字是'appbar1',愿意的話改個名字,通常沒有必要因為程序中只有一個狀態(tài)條,而且這種情況下它的系統(tǒng)名稱不 不引起混淆。在屬性窗口,設(shè)置'progress'為'no'。

完成后gtemp程序窗口應(yīng)該象左圖那樣。我們還沒有設(shè)置數(shù)據(jù)及程序應(yīng)該做什么,不過希望你已經(jīng)學會了如何調(diào)出菜單編輯器,通過屬性窗口如何設(shè)置一些參數(shù),以及在glade中自由瀏覽。如果你對所做的不滿意,可以備份每次glade保存所寫的 *.glade文件,或重新載入程序,或從頭開始。




Gtemp:用Glade創(chuàng)建界面的范例
填充主程序窗口
象任何程序一樣,在Gtemp中有很多種方法來檢查和顯示數(shù)據(jù)。 present the data in Gtemp. 我們可以在"edit"菜單->properties下設(shè) 一人菜單,讓用戶選擇是從 C 轉(zhuǎn)換到 F ,還是從 F 轉(zhuǎn)換到 C ?梢栽谥鞔翱谙略O(shè)置選項菜單讓用戶選擇是哪種轉(zhuǎn)換。另一個方法更有用些,它只需要很少的幾步就能得到正確結(jié)果。這個方法還可以擴展,這樣我們能加入英里轉(zhuǎn)公里、公里轉(zhuǎn)英里等等。不過,這個程序我們只做溫度單位的轉(zhuǎn)換。輸入數(shù)據(jù)最簡單的方法是從一個文本框里獲得。在C文本框里輸入數(shù)值,就是從C轉(zhuǎn)換到F。 在F文本框里輸入數(shù)值,就是從F轉(zhuǎn)換到C。沒有用到的文本框返回結(jié)果。

我們需要兩個溫度單位標簽,兩個輸入/結(jié)果的文本框。不需要設(shè)個按鈕來 開始運算,在文本框按下回車鍵就會發(fā)出信號來開始。

每個窗口組件象文本框和標簽需要放到容器里,F(xiàn)在,gtemp程序中空窗口就 是一個容器,不過它只能放入一個控件,因此我們需要在其中放入一個容器控件。 可以橫向或縱向盒子容器,不過表容器更適合些。

在調(diào)色板里選擇gtk+基本,點表容器控件。它在第7行從右數(shù)第2個。樣子象:

在gtemp窗口,點空陰影部分。會彈出一個窗口,詢問表有多少行和列。設(shè)行和 列為2,因為我們需要兩個標簽和兩個文本框。如果需要后面可以在屬性窗口中改變 它。gtemp窗口看上去應(yīng)該象右圖那樣。

現(xiàn)在加入標簽。點調(diào)色板的標簽控件,它在gtk+ basic頁下,第2行第1個控件, 樣子是。點gtemp程序窗口中表的左上 角部分,標簽放進窗口,名字叫'label1'。

在屬性窗口把標簽的名字改為fahr_label。標簽內(nèi)容改為'Fahrenheit'。它看 上去好象被壓扁了,是不是?讓我們擴展一下。在標簽的屬性菜單的主頁面上有 X和Y排列文本框。把它們從0改為5,F(xiàn)在標簽看上去好看些了。

創(chuàng)建另一個標簽,放在表的右上角。名字叫做cel_label,內(nèi)容為'Celsius'。 把它的排列改成與fahr_label一致。gtemp程序窗口看上去象左圖那樣。

下一步加入文本框控件。調(diào)色板中選擇文本框控件。它在第2行每2列,樣子是 。在gtemp程序 窗口點表的右下角放入文本框控件。

這個控件還需要改名并排列。改名為'fahr_entry',切換到屬性窗口的第2頁 (packing),設(shè) h padding 和 v padding 為5。在這頁點"yes"按鈕,關(guān)閉 x expand屬性。

表的右下角加入另一個文本框,名字是'cel_entry',排列改為跟上面那個一 樣,記住關(guān)閉 x expand屬性。

glade窗口按"save"保存你的工作?瓷先(yīng)該是右圖那樣。

調(diào)整一下窗口,拖窗口的角來擴大和縮小窗口。你可能不喜歡它擴大和縮小、或是它的樣子。這4個我們需要的小控件占了很大的地方。你可以在屬性窗口設(shè)置所有控件的排列和擴展屬性,包括容器控件。作者喜歡表的邊設(shè)為5,打開homogenous 屬性。可能你喜歡另一種外觀。

本節(jié)學會了如何在容器控件里放入控件,如何設(shè)置排列和擴展屬性,以及如何 設(shè)置控件的名字。你應(yīng)該很熟悉屬性窗口。你可以在控件上點右鍵來選擇同一個父, as well as 控件樹上的其它控件,并可以復(fù)印、剪切、粘貼或刪除。



Gtemp: 用Glade創(chuàng)建界面的范例
加下一個窗口
Gtemp程序用狀態(tài)條來顯示錯誤信息,因此不需要彈出的對話框或錯誤窗口。 不過,需要一個"關(guān)于"窗口,下一步我們加入它。

我們可以從gtk+基本控件中創(chuàng)建這個窗口,不過既然我們已創(chuàng)建了一個glade程序,就用glade的"關(guān)于"控件來代替。在調(diào)色板窗口點gnome按鈕進入gnome控件頁。 選擇第1行第2列的'gnome about dialog'控件,這會創(chuàng)建一個"關(guān)于"窗口。

在屬性窗口改名為gtemp_about。gtemp沒有圖標或標識,就讓它們空著。 把想寫的內(nèi)容加入到版權(quán)和作者窗口。記住,初版gtemp由Rikke D. Giles編寫, 做為一個教程練習。原始的版權(quán)是GNU copyleft。完成后看上去如右圖。



加入信號和回調(diào)函數(shù)
作者趨向于立刻加入全部信號處理同時進行后端編程。 Gtemp只有很少幾個信號,現(xiàn)在我們開始加入它們。點擊窗口右上角的x關(guān)閉"關(guān)于" 對話框。注意"關(guān)于"對話框已經(jīng)加入到glade主窗口的控件列表中。

在gtemp程序窗口點退出按鈕,在屬性窗口會顯示它的屬性。點signals頁,來設(shè)置signals頁。信號文本框旁邊是一個標有"..."的按鈕,點它會出現(xiàn)這個控件信號的列表。信號根據(jù)控件的不同而不同,不過所有控件通常都有一些基本的信號,因為它們都是GtkWidget和 GtkContainer的子類。對于退出按鈕,在GtkButton信號中選擇'clicked',點OK,彈出的信號列表會消失。這個信號及句柄已寫入正確的文本框內(nèi)。點擊"add",這個信號句柄會加入到信號句柄的列表中。加入一個信號 就是這么簡單。

菜單編輯器已經(jīng)自動地加入信號,因此我們不需要對gtemp中的主菜單做任何事情。不過,我們需要捕獲當文本框使用時的活動信號。高亮 fahr_entry控件。屬性窗口還顯示在signals頁,點"..."鍵,從GtkEntry信號中選擇"activate"。右圖是這個列表。注意它如何從按鈕控件變化的。選擇"activate"后,點擊"ok"再點擊 "add"把信號加入信號句柄列表中。對cel_entry控件做同樣的工作。這是目前gtemp 所需加入的所有信號。

"關(guān)于"窗口有什么信號呢? 由于這是一個系統(tǒng)gnome對話框,已經(jīng)設(shè)好了信號句 柄。我們沒有理由去動它們,除非想要做的與系統(tǒng)設(shè)置的不同(為什么要這樣?)。
作者: bitmilong    時間: 2005-11-24 19:04
后端: 與GUI互動
庫和API
當編寫GTK+和GNOME程序時,需要注意幾個不同的庫和工具。以下是它們的列表,并帶有簡短的介紹。

Glib:
Glib提供了一些函數(shù),用來替代基本的C函數(shù)特別是具有緩沖區(qū)溢出危險的函數(shù)。如果你正在進行g(shù)nu,gtk+和gnome程序的編寫,Glib很值得學習;続PI在這里。許多先進的控件,比如列表和選項菜單用到了Glib中的鏈表,這也是需要熟悉它的另一個原因。
GDK:
GDK是一個基本的庫,把GTK和窗口系統(tǒng)的細節(jié)隔離開。它面對窗口管 理器,比如metacity, sawfish或其它東西。它提供了很基本的畫圖工具及可能用在 callbacks.c里的函數(shù),大多數(shù)函數(shù)用來隱藏和擴大窗口。API在這里。
Gtk+:
Gtk+是Gimp工具箱。版本1.* 與版本2.*不一致。Glade2使用2.*, Glade使用1.*。這個教程使用Gtk2。你可以在這里找到這些 API。Gtk+很重要,它提供了為Gtk+控件改變屬性、捕獲信號、獲得并放置數(shù)據(jù)等等的所有函數(shù)。每個控件及其相關(guān)函數(shù)在API有描述,這是用 Glade編程的主要參考手冊。
Libgnome和libgnomeui:
這些庫包含了額外的gnome庫。 如果你用glade開發(fā)gnome程序,需要安裝它們。我們用在gtemp中的gnome控件也在這些庫 里,APIs提供了使用這些控件的細節(jié)。查看libgnome文檔 和libgnomeui文檔。
Libglade:
glade用Libglade從*.glade文件中創(chuàng)建代碼。 開發(fā)者可以用來做同樣的事,載入一個*.glade xml文件來創(chuàng)建界面代碼。參考手冊在這里。
其它庫:
還有一些可用的其它庫,是gnome/gtk系統(tǒng)的一部分。 它們的API在gnome.org網(wǎng)站上的gnome開發(fā)者站點。
指向控件
連接后端和GUI僅僅是顯示和接收來自控件的數(shù)據(jù)。上面提到的Gtk+和Gnome庫文件為每一個控件提供函數(shù),允許你設(shè)置和獲取數(shù)據(jù)。不過有時在程序中你還是要指向控件。

最簡單的方法是使用Glade在support.c里提供的lookup_widget()函數(shù)。這個函數(shù)以一個控件和控件名字做參數(shù),返回所要的控件(如果它在參數(shù)控件的樹里)。例如,Gtemp界面里創(chuàng)建了一個控件叫做fahr_entry,它在主程序窗口樹中。如果我們正在處理fahr_entry的一個活動回調(diào)函數(shù),不過想找到控件 cel_entry,把數(shù)據(jù)放進去,可以用 GtkWidget *cel_entry = lookup_widget(GTK_WIDGET(fahr_entry), "cel_entry")。這個看上去有點糊涂,不過基本上它是一個聲明為GtkWidget類型 (cel_entry)的指針,與控件自己指的是同樣一個東西。

另一個指向一個控件的方法是使用gtk_widget_get_toplevel()。參數(shù)是子控件。例如,找出cel_entry最上層的容器控件(通常是gtemp程序窗口)可以這樣做 ... GtkWidget *gtemp_app = gtk_widget_get_toplevel(GTK_WIDGET(cel_entry));.

你也可以使用靜態(tài)或全局變量來聯(lián)系控件。經(jīng)常這是從子窗口(如彈出窗口和對話框)指向主窗口是最簡單的方法。不過,使用太多的全局變局會被認為是糟糕的編碼,鼓勵限制使用這它們。如果我們使用gtemp_app做為一個全局變量,并在main.c里實現(xiàn)它,那么在callbacks.c或其它需要用到的地方中把它聲明為外部變量。從這個角度, Gtemp不需要做這些。

Glib提供了一種方法,可以將任何g_object和gtk+對象關(guān)聯(lián)到一個關(guān)鍵字符串上。注意Gtk+小于2.0時,有一個gtk_object類,現(xiàn)在包含在g_object下。任何時候你可以使用指向設(shè)在一個對象上的數(shù)據(jù)。例如,這段代碼設(shè)置一個指向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函數(shù)會更好些。不過,這個技術(shù)很適合從一個窗口指向另一個窗口,而且不會用到全局變量。這樣你可以從一個彈出窗口獲得數(shù)據(jù)并輸入到主窗口,比如不需要使主窗口全局化。

調(diào)出新窗口或菜單
Glade在interface.c里寫入每個設(shè)計出來的窗口或彈出菜單的創(chuàng)建函數(shù)。通常使用這些函數(shù)沒有必要編輯interface.c文件。這些函數(shù)叫做create_windowname(), 沒有參數(shù),返回一個指向?qū)嶋H窗口或彈出菜單控件的指針。例如,下面這段代碼為 Gtemp創(chuàng)建"關(guān)于"窗口:
GtkWidget *about;

about = create_gtemp_about();

是,就是這么簡單。

當窗口不再使用時銷毀它
如果你已經(jīng)創(chuàng)建了一個彈出窗口或?qū)υ捒,再也不會用到它,你可以用gtk_widget_destroy() 銷毀它。參數(shù)是想要銷毀的GtkWidget。通常這個函數(shù)會被要銷毀窗口的"ok"或"cancel"鍵調(diào)用。例如,從一個名叫 'which_file'的彈出窗口上的"ok"按鈕銷毀這個窗口,只需要在這個按鈕的回調(diào)函數(shù)中調(diào)用上面那個函數(shù)。:
gtk_widget_destroy(gtk_widget_get_toplevel(GTK_WIDGET(ok_button)));

注意我們沒有把這個按鈕自己傳入這個函數(shù),這只會銷毀這個按鈕。我們 把按鈕的上層父控件(窗口)傳入函數(shù)。

下一步?
現(xiàn)在你知道了庫的參考手冊在哪兒,如何指向程序中的控件,是時候轉(zhuǎn)向編寫代碼了。程序的內(nèi)容通常包含收到數(shù)據(jù)如何處理,或顯示之前如何處理。Glade這方面不做任何事情,程序開發(fā)變成了一個編碼問題,而不是一個界面問題。想知道一個簡單的界面如何連接到一個一個簡單的后端,我們將轉(zhuǎn)入到Gtemp程序。



后端編程: 回到Gtemp
第一次編譯
如果沒有保存,就在glade的主窗口保存你的程序。點聯(lián)編按鈕來生成程序代碼。 如果你想的話,可以檢查一下gtemp子目錄看生成些什么。


打開一個終端窗口
在gtemp目錄,輸入autogen.sh
你可以看到一長列autogen和autoconf的信息。除非 配置突然跳出,否則不用管它。
當autogen結(jié)束輸入'make'。
進入/src子目錄。列文件可以看到已經(jīng)有一個gtemp的可執(zhí)行文件。
輸入./gtemp運行這個可執(zhí)行文件。

gtemp程序開始運行。可以看到我們創(chuàng)建的所有窗口--主程序窗口和"關(guān)于"對話框都打開了。你可以關(guān)閉"關(guān)于"窗口,象前面所討論的那樣它已經(jīng)設(shè)好了信號和回調(diào)函數(shù)。不過,我們不希望一下子打開兩個窗口,這是我們要修改的第一件事情。

點窗口右上角X關(guān)閉程序。注意命令行并沒有返回到開始運行g(shù)temp的終端窗口。這是因為為窗口圖標自動創(chuàng)建的回調(diào)函數(shù)(最小化、最大化和關(guān)閉)沒有完全關(guān)閉程序。這顯示得很愚蠢,同時你在一個程序里使用多個窗口。用戶關(guān)閉彈出窗口,程序應(yīng)該結(jié)束。我們將來設(shè)置回調(diào)函數(shù)以便點擊X時程序關(guān)閉。這是我們要修改的第二件事情。

我們需要當按下"退出"按鈕或選擇菜單條"文件"下的退出時程序能夠退出。這是加入 第三件事情。還要當選擇"幫助"菜單下"關(guān)于"菜單項時彈出"關(guān)于"窗口。還剩最后一個 事情, C 到 F 或 F 到 C 的實際轉(zhuǎn)換。

程序開始時只打開一個窗口
打開一個編輯窗口。本教程作者使用Gvim,不過Emacs、gedit或一個字處理軟件也 可以。Gvim和Emacs很適合,因為能給代碼加顏色。打開gtemp的main.c文件。它在 /src子目錄下。

main.c文件開頭幾行說明了glade不會改寫這個文件,可以根據(jù)需要來修改它。記住, 如果你打開的glade生成文件沒有這樣說,就不要編輯它。來到main()函數(shù),找到聲明 GtkWidget *gtemp_about,刪掉它。

向下翻找到
gtemp_about = create_gtemp_about ();
gtk_widget_show (gtemp_about);
刪掉它們。

Glade為每一個設(shè)計的窗口生成create_xxx()函數(shù)比如create_gtemp_about()。當需要時可以用在你的代碼中來創(chuàng)建它們。每一個窗口創(chuàng)建后用with gtk_widget_show()來顯示。 現(xiàn)在我們刪掉了這些行,不過很快會把它們加入到"關(guān)于"菜單項的回調(diào)函數(shù)中。

使Gtemp主窗口右上角的X工作
首先,我們需要加入另一個回調(diào)函數(shù)。在Glade選擇Gtemp程序窗口,進入屬性窗口。 在signals頁,選擇GtkWidget信號下的delete_event信號,把這個信號句柄加入列表,保存,重建程序。

用你選擇的編輯器打開callbacks.c文件。你可以看到前面我們加入的所有信號句柄或 回調(diào)函數(shù),剛才加入的delete event在文件的最下面。轉(zhuǎn)到這兒。

加入
gtk_main_quit();

return FALSE;
在on_gtemp_app_delete_event()函數(shù)里。 想知道gtk_main_quit()函數(shù)的更多信息,你可以查詢 gtk+ API在 gtk-General部分.

使"退出"菜單項和"退出"按鈕工作
在on_quit1_activate()函數(shù)加入
gtk_main_quit()
函數(shù)調(diào)用。就做這么多。 on_quit_button_clicked()函數(shù)也這樣處理。

選擇"關(guān)于"菜單項時載入"關(guān)于"窗口
查找函數(shù)名為on_about1_activate()在這兒加入從main.c文件刪 掉的創(chuàng)建窗口的代碼。把下面的代碼加進去:

GtkWidget *about

about = create_gtemp_about();
gtk_widget_show(about);

這就可以了。
作者: bitmilong    時間: 2005-11-24 19:04
現(xiàn)在可以測試剛才所做的工作。在/src輸入make重新編譯。如果沒有打字或其它錯誤, make不會顯示任何錯誤信息。運行g(shù)temp檢查我們所做的工作。

現(xiàn)在我們開始編寫后端。這個很簡單,不過在一個復(fù)雜的程序里,可能有幾個輔助的 文件,絕大多數(shù)后端不會放在callbacks.c,比如在gtemp里.

最后使Gtemp能夠轉(zhuǎn)換溫度單位
目前在callbacks.c里應(yīng)該有四個空的回調(diào)函數(shù)。其中兩個on_properties1_activate() 和on_preferences1_activate(),現(xiàn)在用不到。使用剩下的 on_fahr_entry_activate()和on_cel_entry_activate()。

我們將要編寫一個函數(shù)叫做compute_temp(),它將被這兩個 entry_activate回調(diào)函數(shù)調(diào)用。定義兩個標志, C_TO_F和F_TO_C以便我們知道正在進行哪種轉(zhuǎn)換。 Compute_temp()以調(diào)用的控件、用戶輸入的溫度和轉(zhuǎn)換類型做為參數(shù)。

在文件頭部,在其它#define下面加入這幾行

#define C_TO_F 0
#define F_TO_C 1

void compute_temp(GtkWidget *this_widget, float temperature, int type);

這是這些函數(shù)和標志的聲明。

在文件尾部,所有回調(diào)函數(shù)的下面,加入這個函數(shù):

void compute_temp(GtkWidget *this_widget, float temperature, int type)
{
GtkWidget *other_entry = NULL;
float result = 0.0;
gchar *result_string = NULL;
switch(type) {
case C_TO_F:
result = ((9.0 / 5.0) * temperature) + 32.0;
other_entry = lookup_widget(this_widget, "fahr_entry");
break;
case F_TO_C:
result = (5.0 / 9.0) * (temperature - 32.0);
other_entry = lookup_widget(this_widget, "cel_entry");
break;
}
result_string = g_strdup_printf("%5.2f", result);
gtk_entry_set_text(GTK_ENTRY(other_entry), result_string);
g_free(result_string);
}

單步執(zhí)行這個函數(shù),它聲明了正確的變量,進入了一個分支語句,在這個語句中溫度單位的轉(zhuǎn)換取決于傳入了哪個文本框:other_entry = lookup_widget(this_widget, "cel_entry"); and other_entry = lookup_widget(this_widget, "fahr_entry"); 使用glade支持函數(shù)lookup_widget() 找到?jīng)]有用戶輸入的那個文件框。Gtk_entry只接收文本,因此我們把浮點數(shù)通過 g_strdup_printf()轉(zhuǎn)換成文本。這個功能很象printf() 函數(shù),不管字符串有多長都能確保分配了足夠的內(nèi)存。接下來用gtk_entry_set_text() 把結(jié)果寫入gtk_entry控件。用g_free()釋放我們用 g_strdup_printf()創(chuàng)建的結(jié)果字符串。

所有的這些函數(shù)都可以在gnome.org上API部分查到。GtkEntry詳細信息請看 這頁。 你可以在這里 查到Glib字符串功能。

還需要在entry_activate里寫入代碼來實際運行compute_temp函數(shù)。找到回調(diào)函數(shù)名為 on_fahr_entry_activate() 加入以下代碼:

gchar *fahr = NULL;

fahr = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);

compute_temp(GTK_WIDGET(entry), atof(fahr), F_TO_C);

這兒我們沒有做 任何錯誤檢查,只是用atof()把字符串fahr轉(zhuǎn)換成浮點數(shù)。后面我們會加入錯誤檢查。找到on_cel_entry_activate()函數(shù),加入以下代碼:

gchar *celsius = NULL;

celsius = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);

compute_temp(GTK_WIDGET(entry), atof(celsius), C_TO_F);

同樣,我們后面會加入錯誤檢查。注意在每一個代碼片斷我們使用GtkEditable代替GtkEntry。這是因為GtkEntry某些方面不推薦使用(在 Gtk+-1.0,不過在2.0中以恢復(fù)了entry_get_text 函數(shù)),特別是gtk_entry_get_text()函數(shù)。由于GtkEntry是GtkEditable的一個子類,用GtkEditable函數(shù)是比較有效的。我們只要記住用GTK_EDITABLE()轉(zhuǎn)換宏把它 轉(zhuǎn)換成一個新類。

現(xiàn)在,我們有一個可用的程序
重新編譯看看。在/src子目錄輸入make,修改任何可能的打字錯誤,運行程序。如果你在文本框只輸入數(shù)字,它會運行得很好。試著在其中一個文本框里輸入'abc'。它給出了一個結(jié)果,因為atof()函數(shù)強行把"abc"轉(zhuǎn)換成一個浮點數(shù),不過我們知道結(jié)果是錯的。如果這個程序只是自己用,而且你知道輸入什么才能得到正確結(jié)果(象大多數(shù)編程者那樣),那我們現(xiàn)在就停下來。不過讓我們更進一小步,加入 簡單的錯誤檢查和提示。

加入錯誤提示
我們要寫另一個函數(shù)check_temperature_value(),它將檢查以確保輸入的數(shù)值是數(shù)值型而不是其它。這個函數(shù)同樣也被兩個entry_activate函數(shù)調(diào)用,向程序 狀態(tài)條輸出一條錯誤信息。

在callbacks.c文件的底部加入函數(shù):

gint check_temperature_value(GtkWidget *this_widget, gchar *value)
{
GtkWidget *appbar;
gint num = 0;
gchar this_char = '';

this_char = *value;

if (!this_char)
return 0;

while (this_char != '') {
if (!isdigit(this_char)) {
/* set up the error message */
appbar = lookup_widget(GTK_WIDGET(this_widget), "appbar1");
gnome_appbar_push(GNOME_APPBAR(appbar), "Please enter numbers only");
return 0;
} else {
num++;
this_char = value[num];
}
}
return 1;
}



我們需要在entry_activate回調(diào)函數(shù)調(diào)用這個函數(shù)。加入以下這些行到 on_cel_entry_activate()中,在compute_temp() 函數(shù)調(diào)用之前:

if (!check_temperature_value(GTK_WIDGET(entry), celsius))
return;
clear_appbar(GTK_WIDGET(entry));

把同樣的行加入到 on_fahr_entry_activate()中,在 compute_temp()函數(shù)調(diào)用之前:

if (!check_temperature_value(GTK_WIDGET(entry), fahr))
return;
clear_appbar(GTK_WIDGET(entry));



最后我們需要clear_appbar()函數(shù)。它只是在輸入是個正確的數(shù)字時從狀態(tài)條上消除 錯誤信息。把它加入callbacks.c文件的最后:

void clear_appbar(GtkWidget *this_widget)
{
GtkWidget *appbar;

appbar = lookup_widget(GTK_WIDGET(this_widget), "appbar1");
gnome_appbar_clear_stack(GNOME_APPBAR(appbar));
}

不要忘了在文件頭部附近加入兩個函數(shù)頭。編譯程序,現(xiàn)有你有一個能工作、錯誤檢查并發(fā)出信息的Gtemp版本!
作者: bitmilong    時間: 2005-11-24 19:06
控件的更多細節(jié)

接下來是一些常用的控件列表,及它們所用的一些gtk函數(shù)。沒有列出函數(shù) 參數(shù),也沒有列出每個控件的所有函數(shù)。如果需要這些信息請到這個教程的 庫部分。

注意下面并不是控件的詳細列表。 在Glade沒有包含的庫里有很多可用的控件。還有一些Gtk+控件比較容易理解 (如垂直和水平分隔線)也沒有列在這里。
Gtk+基本控件
Image 名稱 目標 函數(shù)及參考
gtk window icon 窗口 基本Gtk窗口 編程者不需要注意什么特別的函數(shù),不過如果這是主窗口,你需要把gtk_exit()與delete_event信號關(guān)聯(lián)(比如當點擊右上角的X時)。
Gtk Dialog Window 對話框窗口 創(chuàng)建一個基本的對話盒/窗口 它沒有什么特別的函數(shù)。你需要向按鈕條加入按鈕和其它你想要的東西。
Gtk File Selection 文件選擇對話框 創(chuàng)建一個標準化的文件選擇對話框窗口 內(nèi)部工作由控件來處理。你需要連接按鈕的信號(如clicked信號),及獲得選擇結(jié)果。
Gtk Color Selection Dialog 顏色選擇對話框 選擇顏色的對話框窗口 創(chuàng)建一個標準化的顏色選擇對話框盒/窗口。你需要使按鈕工作,并用 gtk_color_selection_get_color()獲得顏色選擇結(jié)果。
Gtk Font Selection Dialog 字體選擇對話框選擇字體的對話框窗口這是一個標準化的字體選擇對話框盒/窗口。通常你需要設(shè)置按鈕并獲取選擇結(jié)果。使用 gtk_get_font_selection_dialog_get_font() 做這件事。還有其它的函數(shù)來獲取字體的名字及其它。查看列在本教程幫助部分的GTK+參考手冊。
gtk menubar 菜單條 創(chuàng)建一個菜單條 你需要為所有下拉菜單的activate信號創(chuàng)建句柄。在Glade中有菜單編輯器來幫你做這個。參考本教程菜單編輯器部分。
gtk toolbar 工具條 創(chuàng)建一個工具條 你需要為按鈕設(shè)置句柄。(通常是clicked 信號)。你還得在屬性窗口里為一個按鈕提供圖標(或使用標準圖標)及命名。
gtk label 標簽 創(chuàng)建一個標簽控件 它通常沒有信號。這允許你在程序中放入一個標簽。
gtk entry widget 文本框允許輸入單行文本使用gtk_entry_set_text()、gtk_editable_get_chars()、 gtk_entry_set_editable() 有其它函數(shù)來操作這個單行文本。通常使用activate和changed信號。使用changed信號,設(shè)置一個標志,其后獲得框內(nèi)數(shù)據(jù) (比如當按下OK鍵時)。
gtk Combo Box 下拉框 創(chuàng)建一個下拉框 使用這個控件或Gnome文本框創(chuàng)建一個下拉的框列表。 Gnome文本框自己管理這個列表,而ComboBox需要你自己來處理。它可以使用文本框的函數(shù),獨有的函數(shù)有: gtk_combo_set_value_in_list()等。
gtk text box 文本視圖 多行文本編輯器 這個控件與Gtk+ 1.*相比有很大的變化。先創(chuàng)建一個GtkTextBuffer,在這里編輯文本,并在GtkTextView顯示它。在一個很簡單的程序中,可以用 gtk_text_view_get_buffer() 得到緩沖區(qū),并用gtk_text_view_set_buffer()設(shè)置它。緩沖區(qū)自己發(fā)出信號,比如changed,insert_text等。視圖本身了發(fā)出copy_clipboard, move_focus等信號。
Gtk Button 按鈕 一個基本的按鈕 所有按鈕最常用的信號是clicked信號,也可以用enter, leave, pressed, released等。沒有用來獲得數(shù)據(jù)的特別函數(shù),不過你可能經(jīng)常會想讓按鈕最后銷毀它的父窗口,用 gtk_widget_destroy()函數(shù)。
Gtk Toggle Button 切換按鈕 一個基本的切換按鈕 這個按鈕用來代表有兩種狀態(tài)(開/關(guān),0/1等)的變量和實體。它有一個特別的信號toggled,其它與普通按鈕信號一樣。
Gtk Check Button 多選按鈕 一個多選按鈕(用標簽切換) 這是一個切換按鈕,它也有兩個狀態(tài)(開/關(guān)等)。這種按鈕也有標簽,使它是一個有標簽的切換按鈕。你可以使用 toggled 信號。
Gtk Radio Button 單選按鈕 一個單選切換按鈕 它是一種特殊的多選按鈕。單行按鈕組成一組,當點擊一個時其它都變成"關(guān)"或未被選擇。這允許編程者從許多項目中選擇一項。它的信號當然是toggled。在屬性窗口中,可以設(shè)置單選按鈕的組和標簽。
Gtk Option Menu 選項菜單 創(chuàng)建一個菜單,用戶可以選擇一項。 常用的信號是clicked, enter, leave, pressed等。函數(shù)有g(shù)tk_option_menu_get_menu(), gtk_option_menu_set_menu()等。本教程后面有一個例子,說明如何把句柄聯(lián)接到這個控件。
Gtk Spin Button 滾動按鈕增加數(shù)字的按鈕這是個有用的方法,可以從用戶獲取數(shù)字。數(shù)字在一個范圍內(nèi),而且一直是數(shù)字型(如果你在屬性窗口設(shè)數(shù)字型為TRUE)。也可以設(shè)范圍、增幅和開始的數(shù)字。使用changed 和 activate 信號可以從滾動按鈕獲得數(shù)據(jù)。例如gtk_spin_button_get_value_as_float()或 gtk_spin_button_get_value_as_int ()。(記住用changed 信號設(shè)置一個標志,以后接收數(shù)據(jù)(如當按下OK鍵時))。
Gtk Status Bar 狀態(tài)欄顯示狀態(tài)信息的地方它通常放在程序的底部,顯示程序在做什么。比如,用戶按下一個按鈕來保存一個文件時,你可以在這兒顯示"文件已保存"。使用 gtk_statusbar_push(), gtk_statusbar_pop()及其它函數(shù)。
Gtk List or Tree View 列表或樹視圖 顯示樹和列表的控件 這是Gtk+ 2.0中新控件, 代替ctree,clist,list和tree控件。理論上它有點復(fù)雜,不過使用起來很簡單。更多信息請看AP,不過基本上你可以創(chuàng)建一個列表或樹模型,并用列表或樹方式來瀏覽。
Gtk Image Gtk圖像控件 顯示一幅圖像 這是一個沒有窗口的控件,它不接收事件,只是簡單地用來顯示 圖像/動畫/其它。
Gtk Drawing Area 畫圖區(qū) 創(chuàng)建custom控件的地方 使用這個控件來創(chuàng)建custom控件,可以畫東西(比如圖像)等

Gtk容器
gtk handle box 帶柄盒子(譯注:就是浮動工具條) 創(chuàng)建一個盒狀容器,可以通過柄來移動。 它沒有信號,內(nèi)部自帶柄。這個容器是'rip away'盒子之一, 你可以創(chuàng)建菜單并能把它移動到屏幕上想到的位置。
Horizontal Box Widget 橫向盒子 放置控件的一系列盒子這是一個容器,如果愿意也可以連接信號,不過不需要的。不,我并知道當它垂直排列是為什么叫水平盒子,除非numerically it runs horizontally (比如一串數(shù)字,one for each box).
Gtk Vertical Box 垂直盒子 這是一個容器,如果愿意也可以連接信號,不過不需要的。
Gtk Table Box 表狀盒子 在一個表格式中創(chuàng)建一系列盒子 這是一個容器,如果愿意也可以連接信號,不過不需要的。
Gtk Fixed Gtk Fixed 允許你在容器里固定控件的位置。 這個控件不應(yīng)該在實際中使用。它對那些從VB背景轉(zhuǎn)來的人比較適合, 但會妨礙你學習在Gtk+里如何正確地使用容器。盡量避免使用。
Gtk Horizontal ButtonBox 水平按鈕盒 一個水平地放置按鈕的盒子 這個盒子用來包含按鈕。
Gtk Vertical ButtonBox 垂直按鈕盒 一個垂直地放置按鈕的盒子 這個盒子用來包含按鈕。
Gtk Horizontal Pane 水平面板 創(chuàng)建一個面板,用戶可以放大或縮小在一個窗口里的部件。 這是一個容器,如果愿意也可以連接信號,不過不需要的。 可改變大小的部件是其內(nèi)置的。
Gtk Vertical Pane 垂直面板 創(chuàng)建一個面板,用戶可以放大或縮小在一個窗口里的部件。 這是一個容器,如果愿意也可以連接信號,不過不需要的。 可改變大小的部件是其內(nèi)置的。
Gtk Notebook Widget 標簽頁創(chuàng)建一系列"文件夾"盒子,如果用戶點擊標題,可以改變頁內(nèi)容。這是一系列的容器,如果愿意也可以連接信號,不過不需要的。你想要做的一件事是命名標題,或希望用這個控件來創(chuàng)建一個容易"改變"的布局,注意不要顯示標題。
Gtk Frame 框架 創(chuàng)建一個框架,可以命名 這是一個容器,如果愿意也可以連接信號,不過不需要的。 如果你想,記住命名框架。
Gtk Scrolled Window 滾動窗口 一個滾動窗口控件 這是一個容器,如果愿意也可以連接信號,the scrolling should be taken care of automatically.
Gtk Viewport Gtk視角 創(chuàng)建一個視角 作者對這個控件不是很熟,看API。
作者: bitmilong    時間: 2005-11-24 19:07
控件更多的細節(jié): Gtk+附加

注意下面沒有列出全部控件,在Glade未包含的庫里也有可用的控件。沒有列出每個控件的所有函數(shù)。如果需要這些信息請到這個教程的 庫部分。
Gtk+附加
Image 名稱 目標 函數(shù)及參考
Gtk Horizontal Scale 水平刻度 創(chuàng)造一個水平滑塊 使用它可以允許通過滑動刻度條來選擇一定范圍的數(shù)字。很象滾動按鈕(spin button),你可以設(shè)最小值、最大值、最初數(shù)值,單步增幅及其它。
Gtk Vertical Scale 垂直刻度 創(chuàng)造一個垂直滑塊 和水平刻度一樣,只不過是垂直的。
Gtk Horizontal Ruler 水平尺子 創(chuàng)造一把水平尺子 只是簡單地放置一把水平尺子。可以根據(jù)自己的意愿設(shè)置尺子的刻度。
Gtk Vertical Ruler 垂直尺子 創(chuàng)造一把垂直尺子 很象水平尺子,只是垂直放置。
Gtk Alignment Widget 排列控件 創(chuàng)造一個控件,在它里面可以設(shè)置子控件的排列。 這是一個容器控件,在里面你可以準確地設(shè)置子控件的位置。 (基于容器控件的尺寸)。
Gtk Event Box 事件盒 這個控件可以捕獲事件 這個控件允許你為另一個沒有窗口的控件捕獲事件。
Gtk Calendar 日歷 創(chuàng)造一個日歷控件 你可以用 gtk_calender_get_date()來獲得用戶選擇的日期。你也可以用不同的信號如day_selected等來標記日期及其它。
Gtk Progress Bar 進度條 顯示事件進度的條 可以設(shè)為顯示動態(tài)事件(如前后移動的條)或事情完成百分率。如果設(shè)為百分比模式,用gtk_progress_set_percentage()或gtk_progress_set_value()來更新。.
Gtk Layout 布局 創(chuàng)造一個布局控件 這是一個容器控件,你可以布置其它控件。我自己對它不熟悉。
Gtk Aspect Frame 方向框架 創(chuàng)造一個框架,里面的子控件可以保持它的方向 這是一個容器控件,可以控制子控件(如放在里面的控件) 的方向?梢栽O(shè)置在Glade屬性窗口設(shè)置方向比率。
Popup Menu Icon 彈出菜單 創(chuàng)造一個彈出菜單 典型地用在當用戶在什么上面點擊右鍵。至少從Glade角度,這個菜單很象菜單條上的下拉菜單。
Gtk Arrow 箭頭 創(chuàng)造一個箭頭 只是顯示一個指向四個基本方向其中之一的箭頭。
Gtk Curve Gtk曲線 能被用戶改變的曲線 更多信息請看文檔,這是一個專業(yè)控件,將來會被移出gtk+庫。
Gamma Curve Gamma曲線 可編輯的gamma曲線 更多信息請看文檔。它被用來在GIMP里編輯 gamma曲線,是一個專業(yè)控件。最終它會被移出gtk+到另一個庫。
Horizontal Scrollbar 水平滾動條 一個水平排列的滾動條 沒有什么可說的,它是一個滾動條。
Vertical Scrollbar 垂直滾動條 一個垂直排列的滾動條 另一個滾動條。
Gtk Color Selection Widget 顏色選擇 控制顏色選擇的控件 這是顏色選擇對話框的核心(見教程 Gtk+基本控件)。你可以使用color_changed信號,gtk_color_selection_get_color()及其它函數(shù)。
Gtk Font Selection Widget 字體選擇控制字體選擇的控件這是字體選擇對話框的核心(見Gtk+基本控件)。使用gtk_font_selection_get_font(), gtk_font_selection_get_font_name()及其它。
Input Dialog 輸入對話框 允許配置為XInput擴展設(shè)備的控件 見gtk+文檔。
Custom Widget 定制控件 定制控件放置的地方 如果你在使用不是Glade一部分的定制控件,可以用它為你的控件插入一個放置的地方。


控件更多的細節(jié):Gnome

Gnome控件用于標準化gnome界面。如果你正在創(chuàng)建一個Gnome程序最好使用它們。同Gtk+控件相比,它們簡化一些東西,允許你把你的程序與Gnome資源及其它東西連接起來。

注意下面并不是控件完整的列表。 在Glade未包含的庫里也有可用的控件。沒有列出函數(shù) 參數(shù),也沒有列出每個控件的所有函數(shù)。如果需要這些信息請到這個教程的 庫部分。
Gnome
圖像 名稱 目標 函數(shù)及參考
Gnome Application Window 程序窗口 創(chuàng)建一個標準化的gnome程序窗口 你需要連接菜單和工具條上部件的信號到處理函數(shù)。詳見以上關(guān)于菜單和工具條部分。
Gnome About Dialog 關(guān)于對話框 創(chuàng)建一個gnome關(guān)于對話框 不需要做任何事情,只要填上內(nèi)容(版權(quán)、作者等)。按鈕信號已被自動處理。
Gnome App Bar Gnome程序條創(chuàng)建一個標準gnome程序條這是一個程序條,把stock載入到Gnome程序窗口底部。在Glade屬性窗口你可以設(shè)為顯示一個進度條和一個狀態(tài)消息的區(qū)域。這個區(qū)域可以用來給用戶狀態(tài)信息。函數(shù)中的gnome_appbar_push()和gnome_appbar_pop()處理這個。它也有小緩沖區(qū),更多信息見Gnome參考手冊。
Gnome Druid Gnome Druid 創(chuàng)建gnome druid系列的控件 當程序第一次運行時,Gnome Druid用來使用用戶按他們的喜好定制程序。你需要指定需要多少頁,再用屬性窗口為每個頁設(shè)置屬性及其它。需要連接到finish、prepare、 cancel等信號。同時在druid控件里加入標準頁里你所需要的文本框。
Gnome Color Picker Gnome顏色選擇器創(chuàng)建一個能打開gtk顏色選擇對話框控件的按鈕這個控件是一個按鈕,能顯示已選擇的顏色和缺省顏色。使用不同的 gnome_color_picker_get_*()和 gnome_color_picker_set_*()函數(shù)來處理這個控件里的顏色。連接到本控件的信號是color_set。
Gnome Font Picker Gnome字體選擇器創(chuàng)建一個能打開gtk字體選擇對話框控件的按鈕這個控件創(chuàng)建一個按鈕,能打開字體選擇對話框。它同時也顯示當前的字體。使用 gnome_font_picker_get_font()、 gnome_font_picker_get_font_name()等。連接到本控件的信號是 font_set。
Gnome Icon Entry Gnome圖標輸入框 創(chuàng)建一個'圖標選擇器'按鈕 這個控件創(chuàng)建一個按鈕,能顯示當前圖標,點擊能打開一個圖標選擇器。使用gnome_icon_entry_get_filename()等函數(shù)來控制這個控件。
Gnome Href Button Gnome超級連接 創(chuàng)建一個連接到網(wǎng)頁的按鈕 這個控件是一個按鈕,當點擊會運行用戶缺省瀏覽器并打開一個網(wǎng)頁。你可以用gnome_href_set_url(), gnome_href_set_label()改變標簽及地址。
Gnome Entry Box Gnome輸入框 創(chuàng)建一個下拉輸入框,并自動管理"歷史"。 這是一個標準下拉框,不過輸入歷史記錄被Gnome資源管理及維護?梢允褂脴藴氏吕蛐盘柤昂瘮(shù),也可以使用任何 gnome_entry_*()函數(shù)之一。
Gnome File Entry Gnome文件輸入框 創(chuàng)建一個下拉框,'瀏覽'鍵用來查找文件 有一個 browse_clicked信號,可以用來改變通常打開的文件選擇對話框。你也需要連接到gtk_entry信號(當改變了一些東西)及其它。
Gnome PixMap Entry Gnome位圖輸入框 創(chuàng)建一個位圖預(yù)覽和輸入控件來選擇位圖 這個控件顯示一個所選位圖的預(yù)覽,需要的話輸入框部分返回一個文件名(它是一個簡單的gnome文件輸入控件)。
Gnome Date Edit Gnome日期編輯創(chuàng)建一個可處理的日期和時間控件可以連接到date_changed和time_changed信號。注意它有一個彈出日歷按鈕(內(nèi)部管理)及一個下拉時間選項菜單(也是內(nèi)部管理)。選擇結(jié)果會顯示在日期和時間輸入框中。gnome_date_edit_get_date() 函數(shù)返回控件里輸入的時間。記住它是C中的time_t類型。
Gnome Canvas Gnome畫布 創(chuàng)建一個可畫圖的控件 我對這個控件不熟悉,它的文檔需要被完成。對不起,我知道這兒有幾個界面需要的控件庫,當你需要這個控件它們值得一看。
Gnome Icon List 圖標列表 創(chuàng)建一個圖標列表控件 詳見gnome參考手冊。
Gnome Icon Selection 圖標選擇 創(chuàng)建一個圖標選擇控件 詳見gnome參考手冊。
Gnome Bonobo Control Bonobo控制 執(zhí)行一個眼鏡蛇控制控件 詳見bonoboui文檔,在這里。
作者: bitmilong    時間: 2005-11-24 19:08
控件更多的細節(jié):不推薦和已改變

這些控件要么是gtk+/gnome開發(fā)者不推薦使用,因此在新代碼不會再用,要么是在 Glade1和Glade2之間逐漸消失。當我發(fā)現(xiàn)消失的控件已被移動到新庫,我會注明的。
Deprecated
圖像 名稱 目標 函數(shù)和參考
Gtk List Widget 列表 創(chuàng)建一個列表,列表中的每一行都可以被處理。 常用信號是select_child、 selection_changed, unselect_child。函數(shù)包括 gtk_list_insert_items(), gtk_list_append_items(), gtk_list_remove_items(), gtk_list_select_item(),等。
Gtk Columned List 柱狀列表 一個多列的列表這個控件允許縱向排列列表(如一個文件選擇列表,可以同時顯示文件名、所有者和創(chuàng)建時間。).你需要在屬性窗口里指定選擇模式。這種模式表示在窗口里能否一次性選擇一個或多個條目(缺省是一個)。GtkCList有很多信號,是一個復(fù)雜的控件。詳見 Gtk+參考手冊。
Gtk Columned Tree 柱狀樹 一個多列的樹 如果熟練掌握,這個控件確實很有用。但它很復(fù)雜,如果你需要在老 軟件里使用它,請看指南。
Preview 預(yù)覽 一個預(yù)覽控件 在不推薦使用它之前我從未使用過它,因此請查看指南。
Gnome Dialog Box 對話框 用預(yù)制gnome標準的按鈕創(chuàng)建一個對話框 需要連接句柄到按鈕,你也可以改變按鈕的標簽和圖標,或根據(jù)需要 刪掉一二個。
Gnome Message Box 消息盒子 創(chuàng)建一個標準化的消息盒子 需要加入消息,選擇消息的類型(警告、信息等),處理"ok"按鈕信號。
Gnome Property Box 屬性盒子 創(chuàng)建一個標準化窗口來處理不同的編程屬性 需要處理盒子底部的按鈕及其它在盒子里所創(chuàng)建控件的信號。 它由gtk控件創(chuàng)建,請看上述關(guān)于按鈕等控件的部分。
Gnome Pixmap Gnome位圖 從不同的資源載入和顯示位圖 這個控件能正確地載入、改變大小和創(chuàng)建不同類型的圖片。
消失
Gtk Label with Accelerator 帶快捷鍵的標簽 創(chuàng)建一個快捷鍵的標簽 標簽顯示一個快捷鍵在右邊(如Save Ctrl-S)。它用在菜單之類中。
Gtk Image Widget 圖片控件 創(chuàng)建一個可以放一幅圖片的控件 這個控件內(nèi)有一個圖片,可以被一個程序處理。
Gnome Number Entry Gnome數(shù)字輸入框 用計算器按鈕創(chuàng)建一個數(shù)字輸入框 這個控件有一個計算器按鈕,讓用戶把計算結(jié)果直接加入輸入框中。 它不作任何限制檢查。用gnome_number_entry_get_number()來獲取數(shù)字
Gnome Dial 撥號 創(chuàng)建一個撥號控件 這是一個類例撥號,象一個老式收音機調(diào)諧器撥號。 它只能被設(shè)為查看,或把它轉(zhuǎn)為一個數(shù)值。使用 gtk_dial_get_percentage(), gtk_dial_set_percentage(), gtk_dial_set_value(), and gtk_dial_get_value()來處理數(shù)字。
Gtk Clock 時鐘 創(chuàng)建一個數(shù)字時鐘計數(shù)或顯示準確時間你可以在Glade屬性窗口來設(shè)置顯示格式。要用它做為計時器,在屬性窗口設(shè)置秒和時間間隔。Gtk_clock_start() 使時鐘運行,你需要在一些事件中調(diào)用它(如一個ok按鈕或其它),gtk_clock_stop()停止。
Gnome Calculator Gnome計算器 創(chuàng)建一個計算器控件 你可以用result_changed信號來獲得結(jié)果。 使用gnome_calculator_get_result()函數(shù)來實際獲取它。
Gnome Less Gnome Less 創(chuàng)建一個控件來顯示一個文件或流。這個控件象unix的'more'命令。用戶可以瀏覽一個文本文件?梢栽贕lade屬性窗口指定字體,用gnome_less_show_file() 來顯示文件, gnome_less_show_filestream()來顯示文件流等等。
Gnome Paper Selector Gnome紙張選擇器 為打印創(chuàng)建一個紙張選擇控件 在你的代碼中,找到這個控件,用不同的 gnome_paper_selector_get_*()函數(shù)來把選擇結(jié)果傳到你的打印代碼中。
Gnome Animator Gnome動畫 創(chuàng)建一個控件,可以把動畫加入到程序 查看文檔,因為我對它不熟。




摘要和資源: 用Glade2開發(fā)圖形用戶界面

希望這個教程會讓你朝正確的方向來學習使用Glade。對下一步,對一個初學者我建議以下資源。
網(wǎng)上有一些Glade, Gtk+和Gnome資源。 需要幫助請看以下:

* Glade主頁
* Gnome開發(fā)者的資源
* Gtk+ 參考手冊
* Gdk 參考手冊
* Glib 參考手冊
* Libglade 參考手冊
* Gnome用戶 界面庫參考指南

glade郵件列表在http://lists.ximian.com/mailman/listinfo/glade-users. 它是一個很好的資源。

Havoc Pennington寫了一本《Gtk+/Gnome Application Development》。這本書是另一個關(guān)于Gtk+開發(fā)的很好的信息資源。雖然它完全沒有提到Glade,它闡述了控件如何工作,參數(shù)是什么,如何設(shè)計及實現(xiàn)一個復(fù)雜的程序,glib 提供什么及其它有趣的內(nèi)容。我強力推薦它。如果可以就買它,如果不行這兒有一個開源的html版本在這里。



作者:

這個教程由Rikke D. Giles編寫,是KPLUG的一部分,是在Linuxnorthwest上禮物的一部分,也是為更多寫作準備工作的一部分。
版權(quán):

這個教程一系列網(wǎng)頁版權(quán)歸Rikke D. Giles所有。教程的任何故障和問題請通知她到rgiles@users.sourceforge.net.
Glade:

Glade由Damon Chaplin編寫和維護,加油!
致謝:

控件圖片來自Glade的截圖和Glade提供的png文件。其它圖片由作者截圖。

我使用gvim來做所有的編碼工作。在www.gvim.org能找到它。

我使用blufish來作html編輯。它是一個很好的編輯器,在bluefish.openoffice.nl。
Insipiration:

感謝KPLUG的支持。You guys ROCK! 感謝我的 sig_other,能夠容忍家里這樣一個geek。還要感謝我的媽媽,雖然她不懂一點編程或計算機,從頭到尾是個geek。She _gets_ why I do this.
作者: bitmilong    時間: 2005-11-24 19:10
10000字限制,真煩人,累死俺了
作者: elechi    時間: 2005-11-24 21:18
正在學GTK  謝謝樓主了
作者: bitmilong    時間: 2005-11-24 22:57
原帖由 elechi 于 2005-11-24 21:18 發(fā)表
正在學GTK  謝謝樓主了



去俺Blog上有很多Gtk+的入門教程,當然更詳細的參考http://www.gtk.org/
作者: assiss    時間: 2005-11-25 09:32
大家多多討論GTK+。
用GTK做了幾個小程序了,但感覺還不是很了解它。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2