Gtk+/Glade程式設計(一)--簡介

ztguang發表於2016-03-30
http://jianjiaosun.blog.163.com/blog/static/13612448620110169390202/

By unanao


    本文是我學習GTK+和glade3進行圖形介面程式設計的一點學習心得的整理,主要是使用GTK+/Glade程式設計的文件較少,而且沒有說名如何將二者聯絡 起來,以及二者之間的關係。本文通過比較使用Glade和不使用Glade進行GUI程式設計進行比較,找出二者的異同,從而可以為學習使用Glade進行 GUI設計提供一點學習思路。


一、 什麼是GTK+

    首先,GTK+ 並不是一門程式語言,而是一個開發工具套件,或者說是一個開發庫,用來進行跨平臺GUI應用程式的開發,LinuxWindows或其它平臺都能使用
GTK+GTK+ 就好比Windows上的MFC Win32 APIJAVA 上的SwingSWT或者QtKDE 使用的LinuxGUI開發套件)。

    儘管GTK+ 是用純C語言編寫的,但是提供了其它各種語言的捆綁,允許程式設計師選擇自己喜歡的開發語言來開發GTK+ 應用程式,比如C++, PythonPerlPHPRuby等等。

      GTK+ 開發套件基於三個主要的庫:GlibPangoATK,當然我們只需關心如何使用GTK+ 即可,GTK+ 自己負責與這三個庫打交道。Glib 封裝了大部分可移植的
C 庫函式(允許你的程式碼移植到Windows Linux 上執行)。使用C C++時,將大量使用Glib 庫函式,在我們用C 語言的具體實現過程中我會詳細解釋它們。高階語言如Python Ruby 卻不用擔心Glib 的使用,因為它們有自己的標準庫提供了相應的功能。

      GTK+ 及相關的庫時按照物件導向設計思想來實現的,至於這時如何實現的現在並不重要,不同的程式語言有不同的實現方法,重要的是要知道GTK+ 使用物件導向程式設計技術即可(是的,即使是C 實現的)。每一個GTK+ GUI元素都是由一個或許多個widgets”物件構成的。所有的widgets都從基類GtkWidget派生。例如,應用程式的主視窗是GtkWindowwidget視窗的工具條是GtkToolbarwidget一個GtkWindow是一個GtkWidget但一個GtkWidget並不是一個GtkWindow子類widgets 繼承自父類並擴充套件了父類的功能而成為一個新類,這就是標準的物件導向程式設計思想。我們可以查閱GTK+參考手冊找到widgets直接的繼承關係。對於GtkWindow它的繼承鏈看起來像這樣:

GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow

    因此,GtkWindow繼承自GtkBinGtkBin繼承自GtkContainer等等。在第一個程式中,你不需要擔心GtkWidget物件。widget之間的繼承鏈之所以重要是因為當你查詢某個widget的函式,屬性和訊號時,你應該知道它的父類的函式,屬性和訊號也被此widget繼承了,可以直接使用。在第二部分講述此例項的程式碼時,
你能更清楚的認識到這一點。我們來看命名規則,命名規則帶來的好處是非常便於使用。我們能夠清楚的看出物件或函式是哪個庫中的。以Gtk開頭的所有物件都是在
GTK+中定義的。稍後我們會看到類似Glade XMLGlade開頭的是Libglade庫物件或函式,GErrorG開頭的在GLib庫定義。所有Widgets類都遵循標準camelcase命名習慣。所有操作函式都以下劃線組合小寫字母單詞命名。如gtk_window_set_title()設定GtkWindow物件的標題屬性。

 

二、Glade

    Glade是一種開發GTK+ 應用程式的RADRapid Application Development)工具。Glade自身就是一個GTK+應用程式,因為它就是用GTK+ 開發出來的,Glade
用來簡化UI 控制元件的設計和佈局操作,進行快速開發。Glade的設計初衷是把介面設計與應用程式程式碼相分離,介面的修改不會影響到應用程式程式碼,Glade設計的介面儲存為glade格式檔案,它實際上是一種XML檔案。

    Glade 起先能根據建立的GUI 自動生成C 語言程式碼(你仍然能找到此類相關的例項),後來可以利用Libglade庫在執行時動態建立介面,到了Glade3 ,這些方法都不贊成使用了。這是因為,Glade需要做的唯一的事就是生成一個描述如何建立GUIglade檔案。這給程式設計人員提供了更多的靈活性和彈性,避免了使用者介面部分微小的改變就要重新編譯整個應用程式,同時其語言無關性,幾乎所有的程式語言都可以使用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

Gtk+/Glade程式設計(一) - unanao - unanao
 

    如果有“Set Options in your project”的視窗,直接關閉即可

2、熟悉Glade的主介面


Gtk+/Glade程式設計(一) - unanao - unanao
 

     左邊的是"Palette" 就像是一個圖形編輯程式,可以用它上面的GtkWidgets來設計你的使用者介面。中間部分(剛啟動時是空白一片)是"Editor" 所見即所得的編輯器。在右邊,上部是"Inspector"下部是widget "Properties" Inspector以樹形顯示當前建立的控制元件的佈局,可以對控制元件進行選擇。我們通過Properties中各項內容來設定widgets的屬性,包括設定widgets的訊號回撥函式。


五、程式設計實現一個簡單的視窗:

  點選Palette"Toplevels"分組框中的GtkWindow圖示,你會看到一個灰色視窗出現在Glade中間的Editor 區域。這是GtkWindow的工作區

Gtk+/Glade程式設計(一) - unanao - unanao
     視窗管理器(如GNOME)會自動加上視窗標題,關閉按鈕等,因此我們編輯時看不見。使用Glade時,我們總是需要首先建立一個頂層視窗,典型的是建立一個GtkWindow。以 "window.glade" 檔名儲存工程。這個檔案是一個XML檔案,你可以在文字編輯器中開啟它:

<?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

Gtk+/Glade程式設計(一) - unanao - unanao


2、不使用glade生成,而是在c程式碼中直接建立

#include

int main(int argc, char *argv[])
{

    GtkWidget *window;


    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檔案)
      所 以可以發現使用Glade設計UI,然後用於Gtk程式中十分容易,但是要想知道各個組建如何使用,如何選擇組建,還是要學習Gtk+的文件。雖然 glade可以幫我們完成介面的設計,但是隻是介面而已,各個元件的用法還是要參考GTK+的tutors和手冊。下面將比較使用glade進行介面設計 和使用gtk+直接程式設計的區別,從而理解使用gtk+/glade進行程式設計。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(3831) | 評論(0) | 轉發(9) |
給主人留下些什麼吧!~~
評論熱議

相關文章