Gtk+/Glade程式設計(一)--簡介
By unanao
本文是我學習GTK+和glade3進行圖形介面程式設計的一點學習心得的整理,主要是使用GTK+/Glade程式設計的文件較少,而且沒有說名如何將二者聯絡
起來,以及二者之間的關係。本文通過比較使用Glade和不使用Glade進行GUI程式設計進行比較,找出二者的異同,從而可以為學習使用Glade進行
GUI設計提供一點學習思路。
一、 什麼是GTK+
首先,GTK+ 並不是一門程式語言,而是一個開發工具套件,或者說是一個開發庫,用來進行跨平臺GUI應用程式的開發,Linux,Windows或其它平臺都能使用
GTK+。GTK+ 就好比Windows上的MFC 和Win32 API,JAVA 上的Swing和SWT,或者Qt(KDE 使用的Linux下GUI開發套件)。
GTK+ 開發套件基於三個主要的庫:Glib,Pango和ATK,當然我們只需關心如何使用GTK+ 即可,GTK+ 自己負責與這三個庫打交道。Glib 封裝了大部分可移植的
C 庫函式(允許你的程式碼移植到Windows 和Linux 上執行)。使用C 或C++時,將大量使用Glib 庫函式,在我們用C 語言的具體實現過程中我會詳細解釋它們。高階語言如Python 和Ruby 卻不用擔心Glib 的使用,因為它們有自己的標準庫提供了相應的功能。
GTK+ 及相關的庫時按照物件導向設計思想來實現的,至於這時如何實現的現在並不重要,不同的程式語言有不同的實現方法,重要的是要知道GTK+ 使用物件導向程式設計技術即可(是的,即使是C 實現的)。每一個GTK+ 的GUI元素都是由一個或許多個“widgets”物件構成的。所有的widgets都從基類GtkWidget派生。例如,應用程式的主視窗是GtkWindow類widget,視窗的工具條是GtkToolbar類widget。一個GtkWindow是一個GtkWidget,但一個GtkWidget並不是一個GtkWindow,子類widgets 繼承自父類並擴充套件了父類的功能而成為一個新類,這就是標準的物件導向程式設計思想。我們可以查閱GTK+參考手冊找到widgets直接的繼承關係。對於GtkWindow它的繼承鏈看起來像這樣:
GObject
+----GInitiallyUnowned
+----GtkObject
+----GtkWidget
+----GtkContainer
+----GtkBin
+----GtkWindow
因此,GtkWindow繼承自GtkBin,GtkBin繼承自GtkContainer,等等。在第一個程式中,你不需要擔心GtkWidget物件。各widget之間的繼承鏈之所以重要是因為當你查詢某個widget的函式,屬性和訊號時,你應該知道它的父類的函式,屬性和訊號也被此widget繼承了,可以直接使用。在第二部分講述此例項的程式碼時,
你能更清楚的認識到這一點。我們來看命名規則,命名規則帶來的好處是非常便於使用。我們能夠清楚的看出物件或函式是哪個庫中的。以Gtk開頭的所有物件都是在
GTK+中定義的。稍後我們會看到類似Glade XML以Glade開頭的是Libglade庫物件或函式,GError以G開頭的在GLib庫定義。所有Widgets類都遵循標準camelcase命名習慣。所有操作函式都以下劃線組合小寫字母單詞命名。如gtk_window_set_title()設定GtkWindow物件的標題屬性。
二、Glade
Glade是一種開發GTK+ 應用程式的RAD(Rapid Application Development)工具。Glade自身就是一個GTK+應用程式,因為它就是用GTK+ 開發出來的,Glade
用來簡化UI 控制元件的設計和佈局操作,進行快速開發。Glade的設計初衷是把介面設計與應用程式程式碼相分離,介面的修改不會影響到應用程式程式碼,Glade設計的介面儲存為glade格式檔案,它實際上是一種XML檔案。
Glade 起先能根據建立的GUI 自動生成C 語言程式碼(你仍然能找到此類相關的例項),後來可以利用Libglade庫在執行時動態建立介面,到了Glade3 ,這些方法都不贊成使用了。這是因為,Glade需要做的唯一的事就是生成一個描述如何建立GUI的glade檔案。這給程式設計人員提供了更多的靈活性和彈性,避免了使用者介面部分微小的改變就要重新編譯整個應用程式,同時其語言無關性,幾乎所有的程式語言都可以使用Glade。
三、Gtk+和Glade 相關開發環境的搭建
以Debian 為例:
安裝對應的包名為:
- gtk+:libgtk2.0-dev
- gcc:build-essential
- glade:glade
- make:make
- Devhelp:devhelp
#aptitude install libgtk2.0-dev glade build-essential make devhelp
注:包的名字可能改變(主要是版本號的改變),如果安裝的時候,說找不到哪個包,可以使用aptitude search 包名 (如 aptitude search gtk)
四、文件的獲得
1、Gtk+ Tutors:
http://library.gnome.org/devel/gtk-tutorial/stable/ (官方)
ftp:/ftp.gtk.org/pub/gtk/tutorial (pdf)
初學者的tutors:
http://zetcode.com/tutorials/gtktutorial/
2、GtkBuilder
http://library.gnome.org/devel/gtk/stable/GtkBuilder.html
3、手冊
“應用程式” --> "程式設計" --> "Devhelp"
4、更多文件:
http://www.gtk.org/documentation.html
四、熟悉Glade
1、啟動Glade
如果有“Set Options in your project”的視窗,直接關閉即可
2、熟悉Glade的主介面
左邊的是"Palette" 就像是一個圖形編輯程式,可以用它上面的GtkWidgets來設計你的使用者介面。中間部分(剛啟動時是空白一片)是"Editor" 所見即所得的編輯器。在右邊,上部是"Inspector",下部是widget "Properties" 。Inspector以樹形顯示當前建立的控制元件的佈局,可以對控制元件進行選擇。我們通過Properties中各項內容來設定widgets的屬性,包括設定widgets的訊號回撥函式。
五、程式設計實現一個簡單的視窗:
點選Palette上"Toplevels"分組框中的GtkWindow圖示,你會看到一個灰色視窗出現在Glade中間的Editor 區域。這是GtkWindow的工作區
<?xml version="1.0"?>
你看,這就是一個簡單的XML檔案,Glade能在修改過程中自動儲存到該檔案。
1、使用glade生成的window.glade,編寫一個簡單視窗的程式
/*
Then save this file as window.c and compile it using this command
(those are backticks, not single quotes):
gcc -Wall -g -o window window.c `pkg-config --cflags --libs gtk+-2.0`
Then execute it using:
./window
*/
#include
int main (int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init (&argc, &argv);
builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "window.glade", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
gtk_builder_connect_signals (builder, NULL);
g_object_unref (G_OBJECT (builder));
gtk_widget_show_all(window);
gtk_main ();
return 0;
}
編譯:
$gcc -o window window.c `pkg-config --cflags --libs gtk+-2.0`
執行:
$./window
2、不使用glade生成,而是在c程式碼中直接建立
#include
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);
gtk_main();
return 0;
}
總結: 比較1和2,可以發現:
使用Glade生成的xml檔案進行解析生成GUI
- 不需要呼叫gtk_window_new(直接由xml檔案解析建立)
- 需要呼叫GtkBuilder(由GtkBuilder解析xml檔案)
相關文章
- Gtk+/Glade程式設計(二)--入門程式設計
- Gtk+/Glade 程式設計(四)佈局管理程式設計
- shell程式設計—簡介(一)程式設計
- windows程式設計簡介Windows程式設計
- shell程式設計簡介程式設計
- IO程式設計和NIO程式設計簡介程式設計
- Gtk /Glade程式設計(三) 選單和工具欄程式設計
- Quartz 2D程式設計指南 (一) —— 簡介(一)quartz程式設計
- 結對程式設計簡介程式設計
- Linux Shell程式設計(1)——shell程式設計簡介Linux程式設計
- Scala 簡介 [摘自 Scala程式設計 ]程式設計
- Linux Socket 程式設計簡介Linux程式設計
- WebGL程式設計指南(1)簡介Web程式設計
- BASH SHELL 程式設計簡介(轉)程式設計
- iOS 網路程式設計(一)TCP IP協議簡介iOS程式設計TCP協議
- 函數語言程式設計簡介函數程式設計
- .NET泛型程式設計簡介 (轉)泛型程式設計
- Windows 程式設計簡介從C/C++到Windows程式設計Windows程式設計C++
- 01 Python3程式設計之程式設計語法簡介Python程式設計
- 併發程式設計基礎——JMM簡介程式設計
- 響應式程式設計簡介之:Reactor程式設計React
- js DSL超程式設計簡單介紹JS程式設計
- JavaScript 模組化程式設計簡單介紹JavaScript程式設計
- 伯樂線上程式設計挑戰簡介程式設計
- Linux 程式設計工具簡單介紹Linux程式設計
- 面向方面程式設計的Annotation簡介(轉)程式設計
- SpringBoo+HTMX程式設計簡介Spring程式設計
- 使XML程式設計更簡單---JDOM介紹及程式設計指南 (轉)XML程式設計
- 視覺化程式設計工具Blockly 1.0簡介視覺化程式設計BloC
- Go 語言的網路程式設計簡介Go程式設計
- javascript非同步程式設計幾種方法簡介JavaScript非同步程式設計
- Java桌面應用程式設計:SWT 簡介(轉)Java程式設計
- ModbusTCP協議簡介與程式設計流程圖TCP協議程式設計流程圖
- Matlab簡介與程式設計例項(一)(西北工業大MOOC)Matlab程式設計
- 非同步程式設計測試Awaitlity簡介| Baeldung非同步程式設計AI
- javascript物件導向程式設計概念簡單介紹JavaScript物件程式設計
- javascript函數語言程式設計簡單介紹JavaScript函數程式設計
- javascript如何實現模組程式設計簡單介紹JavaScript程式設計