歡迎您光臨本站 註冊首頁

用Glade和libGlade設計Gtk+圖形界面

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  (作者:張威、曹劍 2001年03月30日 13:41)

  Gnome下已開發出了Glade這一應用軟體,它是傳統界面設計工具Gtk/Gdk的擴展,能滿足基於Gtk+庫的圖形用戶界面可視化開發的基本需求。

  一、Glade簡介
  如果有一種軟體能將圖形界面的設計及時地展現於開發人員的面前,而且在設計完后能直接看到界面的外觀效果,這樣就使程序員的主要精力集中於應用程序核心功能的開發上,這就是所謂的可視化編程思想。

  在Windows環境下,這種可視化的集成開發環境已有許多成熟的產品,如VC++、VB、PB、Delphi、C++Bulider等。基於Linux 操作系統的軟體並不豐富,但絕非一片空白,例如Borland公司推出的Kylix。目前Gnome下已開發出了Glade這一應用軟體,它是傳統界面設計工具Gtk/Gdk的擴展,能滿足基於Gtk+庫的圖形用戶界面可視化開發的基本需求。

  Glade可為你生成界面代碼,基本過程如下:

  1.讓Glade設計出界面元素,設置界面元素屬性,為構件的信號設置回調函數;

  2.將其存為XML格式,觀察並修改不符合要求的部分;

  3.編寫應用其它部分代碼,並在應用中載入Glade文件,編譯C代碼生成執行文件。

  這種模式使設計界面與其它部分代碼完全分開,並且有可能做到在對界面進行改動后不必對應用進行編譯。圖形用戶界面設計小組可不必關心應用程序的運行細節,同時編程人員也可以把他們的時間用於其它方面,而不需為界面的修改重複編寫大量煩瑣的Gtk+函數。這種分工開發的形式符合軟體工程的要求,對GUI軟體的開發也更方便。

  二、使用Glade的預備條件
  在學習使用Glade之前,我們假設你已對Linux操作系統的基本運用有初步了解、熟悉rpm包或gzip包的處理命令、對C語言有一定的了解,並熟悉消息處理編程機制。以上基礎是使用Glade的必備知識,如果讀者在以上某些方面尚存不明之處可先查閱相關資料。為了能更靈活地使用Glade開發應用,用戶最好能熟悉gcc編譯器,掌握make文件的編寫規則。

  我們再來看看如何使Glade加入到Linux操作系統的開發環境中,主要分兩步:

  1.獲得Glade的源代碼

  你可以在大多數Linux操作系統的發布中找到Glade的源代碼,也可從網上下載,目前能方便獲得源代碼的網站是www.Glade.pn.org,下載的文件可能是rpm或zip格式。

  2.解壓、編譯並安裝Glade

  在獲得源代碼后,對壓縮包解壓縮,然後再運行make編譯Glade。

  三、設計界面
  在對Glade有了初步的了解之後,讓我們來看一看它的真面目吧,在Linux上先運行Xwindow,調出圖形化界面后,你可以在虛擬控制台上輸入Glade或在命令選單上找到開發子選單下的Glade項,點擊即可。

  調出Glade后,我們一般能看到三個窗口(如圖1):一個工程管理窗口(主窗口)、一個常用構件窗口和一個屬性管理窗口。這三個窗口構成了一個GUI的開發環境,對於使用過可視化編程的用戶而言,這三個窗口應是很熟悉的。

  工程管理窗口主要負責對一個工程項目的管理,我們所說的工程項目就是指所設計的圖形界面。這個窗口中使用最多的是它的選單,常用的選單是創建新的工程項目,打開一個已有的項目文件進行編輯修改,以及改變對項目的視角等。


  圖1

  常用構件窗口則是由Glade提供的常用Gtk+構件的圖形化集。在需要調用某構件時只需在這個窗口中點擊該構件的圖標,然後在設計好的位置單擊滑鼠,這時構件就被安排到適當的位置。

  屬性窗口主要負責對項目對象的屬性調整,它本身是一個分頁式的notebook構件,在各頁上集中了項目對象(構件)某個方面的屬性,如構件的標題名稱、尺寸大小、位置、停靠對齊方式、快捷鍵設置和信號處理等。

  值得一提的是有些構件是根構件,或者說是頂層容器構件(如頂層窗口構件,對話框構件等),每一個頂層容器構件都會出現在工程管理窗口的主區內,頂層容器之間是獨立的,要使它們能產生連接調度關係還需對由Glade生成的源碼進行少量編輯。一個頂層構件的所有子孫構件由Glade維護在一個構件樹中,我們可以調用工程管理窗口中的「查看構件樹」選單項瀏覽構件樹。

  四、生成代碼選項
  當我們設計出想要的界面后就要讓Glade生成我們需要的代碼,點擊build按鈕,Glade會彈出一個選項窗口,這個窗口中有三頁,分別是普通選項、C語言選項和libGlade選項(如圖2)。


  圖2

  五、Glade生成的文件
  Glade 生成的主要目錄及代碼文件有如下幾個:在項目的根目錄(假設為/root/projects/project1)下有三個子目錄/po、/src和/macros,程序源代碼都放在/src目錄中,這個目錄下的文件可以用文本編輯器再修改以增加應用。

  六、運用XML指針建立構件
  libGlade在程序運行時才根據XML文檔 (.Glade文件)構造構件,為了應用libGlade,我們在程序的開始要對Gnome和libGlade進行初始化。初始程序如下:

  /?初始化 gnome ?/

   gnome_init("phonebook", VERSION, argc, argv);

  /? 初始化libGlade ?/

   Glade_gnome_init();

  獲得一個構件指針的代碼如下:

   /?聲明指針?/

   GladeXML xml;

   GtkWidget dialog1;

  /?在由Glade軟體生成的XML界面文件中找到名為「about1」的根構件,生成XML構件並將構件指針賦給 xml ?/

   xml = Glade_xml_new("phonebook.Glade", "about1");

   dialog = Glade_xml_get_widget(xml, "dialog1");

  /?對不用的指針要及時釋放?/

   gtk_object_unref(GTK_OBJECT(xml));

  設計界面時往往有相對獨立的構件,在建造應用工程時要在這些構件之間建立聯繫,如主窗口和對話框的父子關係等,步驟如下:

  1.用XML建立兩個構件:

  dialog = Glade_xml_get_widget(xml, "dialog1");

  app= Glade_xml_get_widget(xml, "app1");

  2.用gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app))函數將對話框設定為app窗口的從屬構件。

  注意:在用Glade設計界面時有一點需要注意的是所有的構件名不能重名,因為我們要以它們的名字對該構件進行訪問。

  七、消息處理函數
  對於消息處理函數,我們可以在設計構件時就在構件的屬性管理窗口中的signal頁指明(如圖3),Glade在生成的代碼中自動加入函數名。如果用libGlade則有兩點限制:

  1. 回呼函數接收的參數不能指定類型而只能用空指針類型gpointer(void);


  圖3

  2. 因為libGlade是在運行時才調用回呼函數,所以這類函數不能設為 static型。

  八、實例代碼
  以下是用Glade生成的一個示常式序,它是一個簡單的電話薄程序,共有三個用Glade設計的獨立構件,一個主窗口、一個錄入對話框和一個用於展示錄入內容的clist列表構件。

  我們可以從主窗口點擊按鈕彈出對話框,在對話框中有兩個錄入條,分別用於錄入人名和電話號碼,當點擊對話框中的「確定」之後,人名和電話號碼會加入到clist列表中,對話框關閉。有興趣的讀者可以對這個應用程序加以豐富。

  #include 〈string.h〉

  #include 〈gnome.h〉

  #include 〈Glade/Glade.h〉

  #define VERSION "1.0"

   static GtkWidget ?app;

   static GtkWidget ?clist;

   void do_nothing(GtkWidget ?w);

   void run_about_dialog(GtkWidget ?w);

   void add_number(GtkWidget ?w);

   void do_nothing(GtkWidget ?w){

   gnome_app_message(GNOME_APP(app), "Doesn't do anything!");

   }

   void run_about_dialog(GtkWidget ?w){

   GladeXML ?xml;

   xml = Glade_xml_new("phonebook.Glade", "about1");

   if(!xml) {

   g_warning("We could not load the interface!");

   return;

   }

   gtk_object_unref(GTK_OBJECT(xml));

   }

  static void

  really_add_number(GtkWidget ?w, int button, gpointer data){

   char ?strings[2];

   GtkWidget ?name_entry;

   GtkWidget ?phone_entry;

   GladeXML ?xml = data;

   if (button != 0)

   return;

   name_entry = Glade_xml_get_widget(xml, "add_name_entry");

   phone_entry = Glade_xml_get_widget(xml, "add_phone_entry");

   strings[0] = gtk_entry_get_text(GTK_ENTRY(name_entry));

   strings[1] = gtk_entry_get_text(GTK_ENTRY(phone_entry));

   gtk_clist_append(GTK_CLIST(clist), strings);

   }

  void add_number(GtkWidget ?w){

   GtkWidget ?dialog;

   GladeXML ?xml;

   xml = Glade_xml_new("phonebook.Glade", "dialog1");

   if(!xml) {

   g_warning("We could not load the interface!");

   return;

   }

   dialog = Glade_xml_get_widget(xml, "dialog1");

   gnome_dialog_set_parent(GNOME_DIALOG(dialog), GTK_WINDOW(app));

   gtk_signal_connect_full(GTK_OBJECT(dialog),"clicked",GTK_SIGNAL_FUNC (really

  add_number), NULL, xml,(GtkDestroyNotify)gtk_object_unref,FALSE, FALSE);

   }

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

   GladeXML ?xml;

   gnome_init("phonebook", VERSION, argc, argv);

   Glade_gnome_init();

   xml = Glade_xml_new("phonebook.Glade", "app1");

   if(!xml) {

   g_warning("We could not load the interface!");

   return 1;

   }

  app=Glade_xml_get_widget(xml,"app1");

  clist=Glade_xml_get_widget(xml,"clist1");

  Glade_xml_signal_autoconnect(xml);

  gtk_object_unref(GTK_OBJECT(xml));

  gtk_main();

   return 0;

   }

  對於使用過或熟悉Gtk+的讀者來說,這樣的代碼就是以前我們要花大量時間和精力來編寫的。有了這些代碼,我們只要稍作修改就能完成所需的應用界面。

  九、代碼的編譯與執行
  Glade生成所需的代碼后最後一步就是生成可執行文件了。

  1.編譯代碼的條件

  系統中必須安裝automake 1.4和autoconf 2.13以上版本的兩個軟體,一般來說操作系統在安裝時已將這兩個軟體安裝好了,如要獲得這兩個軟體可以到www.rawhide.redhat.com/pub/rawhide/i386/

  redhat/rpms/下載。

  2.編譯代碼的步驟

  #〉./autogen.sh

  在項目根目錄下有一個autogen.sh文件, 它是一個shell腳本文件,運行這個腳本文件就能生成標準的 makefile文件。

  #〉make

  運行make 命令按makefile進行編譯。

  (1)#〉make install

  運行install使某些資源如圖片等安裝到程序中,如果沒有這一步程序也能運行,但當資源文件的路徑有變化時,程序就會因找不到資源文件而出現問題。

  (2)已生成的可執行文件放在/src子目錄下,在該目錄下運行該程序名即可。


[火星人 ] 用Glade和libGlade設計Gtk+圖形界面已經有776次圍觀

http://coctec.com/docs/program/show-post-72346.html