用Gtk+開發Linux上的GUI應用軟體(轉)
用Gtk+開發Linux上的GUI應用軟體(轉)[@more@] 一般一個容器構件只能容納一個構件,如果要在一個容器構件中安排多個子構件,可先將多個子構件放入一個組合框或組合表構件內,再將這個組合框或組合表構件放入該容器構件。 一、如何建立Gtk+應用 1.基本概念 在Linux上開發GUI應用軟體,我們通常利用Gtk+庫。為了深入瞭解Gtk+的應用,我們首先要明確幾個概念。 (1) 構件(widget)的概念 在Gtk+庫裡的視窗、選單和按鈕等應用實體,我們稱之為構件(widget)。構件具有物件導向的特徵,其具體結構由Gtk+庫定義,它對運用構件的程式設計師來說是透明的,除非你想建立自己的構件。在對構件進行安排時,我們只需要關心構件的處理函式,這樣做的目的就是要對應用程式設計師遮蔽構件的細節,使程式設計師將更多的精力集中在應用功能上。 (2) 容器(container)的概念 構件主要分為兩大類,即容器類(container)和雜類(miscellaneous)。大多數構件屬容器類,它們可以像容器一樣容納其它的構件。在安排構件時常常要遵循一個規則:除了組合框(box)和組合表(table)這兩種構件外,其它的容器類構件都只能容納一個構件。雜類構件比容器類構件簡單,但它不能容納其它構件。 (3) 訊息及回呼函式的概念 程式必須能對使用者的操作作出反應,在基於GUI的程式設計中,“訊息”或“訊號”是必要的。使用者點選選單、各種按鈕、輸入使用者資料、查詢執行結果和拖放,都會產生訊息或訊號。訊號可能需要由軟體來加以處理,這時程式設計師就需要編寫訊息回呼函式。訊息或訊號的概念類似於Windows中的事件。在Gtk+ 中經常產生各種訊號,使用者產生的大多數訊號被忽略,只有程式關心的訊號,程式中才有相應的處理函式被呼叫。程式設計師要登記訊號與處理函式之間的關係,告訴 Gtk+哪些訊號或事件是程式所關心的。 2. 構件(widget)的運用 在呼叫Gtk+的構件時,一般進行如下操作步驟: (1) 包含所呼叫構件的標頭檔案 標頭檔案通常存放在/usr/include/gtk/目錄下,該檔案裡有對構件的定義及對構件的操作函式,在我們使用構件時,可以經常在這個目錄下查閱構件函式的呼叫格式或引數。我們不必讓所有構件包含標頭檔案,因為構件的標頭檔案已包含在該目錄下一個名為gtk.h的檔案裡,包含這個檔案就包含了所有構件的標頭檔案。一般系統將編譯的包含目錄指定為/usr/include,所以我們只需寫明 include 即可。 (2) 宣告構件 宣告構件的過程是為了符合C語言中先宣告後使用的原則。一般在程式開始要宣告構件結構的指標,這就為構件分配了地址。 (3) 構件指標的初始化 呼叫構件的建立函式,對構件的屬性進行調整(大小、位置和狀態等),接著顯示構件,這一點不能忽略,如果只建立了構件卻忘了顯示(gtk_widget_show),在應用時,使用者就不能看到構件,也就無法對構件進行操作了。 (4) 安排構件的位置與層次關係 構件之間往往是容納與被容納的關係,也就是說容器內還有容器,層層巢狀。要記住一般一個容器構件只能容納一個構件,如果要在一個容器構件中安排多個子構件,可先將多個子構件放入一個組合框或組合表構件內,再將這個組合框或組合表構件放入該容器構件。注意父容器構件要先於子容器構件建立,父容器構件的顯示要在子容器構件的顯示之後。 (5) 編寫事件處理函式 構件的標頭檔案中定義了構件能響應的事件(訊息),但並非所有的訊息在應用中都是程式所關心的,對於程式應當響應的事件,程式設計師要寫出事件處理函式。 二、應用舉例 為了對Gtk+庫的應用有一個具體的認識,讓我們來看一個簡單的應用例項。 1. 初始化Gtk+ 寫Gtk+程式需要呼叫gtk_init函式對Gtk+庫進行初始化。我們首先將應用程式的變數argc和argv傳遞給gtk_init函式,並檢查主要用於除錯的Gtk+選項。如果在變數列表中出現任何這樣的Gtk+引數,就將它移去。在執行gtk_init函式後,它們不應該出現在應用程式中。初始化Gtk+的程式碼如下: gtk_init(&&argc,&&argv); 2. 建立構件 首先要建立的構件是視窗,它是應用程式的頂層構件,其它構件一般安排在頂層視窗中。視窗是GUI程式的基本框架,在視窗裡我們可以為使用者安排各種方便的應用。一個應用可以有若干個視窗,這些視窗之間既相互獨立,又有層次的關係。視窗有相對固定的風格,前景色、背景色、字型和字號等,我們應當保持定製的風格,確保不使應用軟體雜亂。 按照上面提出的構件運用步驟,我們建立一個程式主視窗: /?宣告構件指標?/ GtkWidget ?window; /?建立視窗,初始化視窗指標,建立一個頂層視窗?/ window=gtk_window_new(GTK_WINDOW_TOPLEVEL); /?顯示構件?/ gtk_widget_show(window); /?登記訊息與訊息處理函式的關係?/ gtk_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(close_window),NULL); 3. 構件型別的轉換 由於建立的構件是通用構件,需要將它轉換為具體的型別以適合呼叫更為專用的函式。比如建立按鈕構件函式會返回GtkWidget 指標,但是專用的按鈕子程式要求返回GtkButton指標,所以在呼叫專用的按鈕函式以前,需要使用GTK_BUTTON宏將通用的GtkWidget 指標轉換為GtkButton指標。通常,構件是由其它構件派生的,視窗構件(GtkWindow)是由容器構件GtkContainer派生的,而容器構件是由通用構件派生的。在Gtk+中可以將構件指標轉換為其父類、祖先類構件的任意型別,然後再呼叫父類或祖先類構件的函式。 4. Gtk+的事件迴圈 對Gtk+進行初始化並將視窗等構件安排在螢幕上之後,應用軟體需要使用Gtk+開始執行事件的迴圈函式gtk_main(),沒有這個函式,應用程式執行時就會一閃即逝。但是在呼叫gtk_main_quit()函式之前對gtk_main()函式的呼叫並不返回,也就是說只有 gtk_main_quit()函式才能停止Gtk+的執行,從而最終退出應用程式。我們把gtk_main_quit()函式放在訊息處理函式 close_window()之中,這樣,當使用者點選了視窗的關閉按鈕,Gtk+收到“delelte_event”訊息,然後呼叫 close_window(),執行gtk_main_quit()函式,整個程式即可退出。 5. 例項原始碼 現在建立一個顯示“hello”字樣的簡單視窗程式。整個程式實現程式碼如下: //hello.c include /?關閉主視窗中的訊息處理函式?/ close_window(GtkWidget ?window,gpointer data) { /?中止gtk事件迴圈?/ gtk_main_quit(); } /?主函式?/ main(int argc,char ?argv) {/?宣告視窗和標籤兩個構件?/ GtkWidget ?window; GtkWidget ?label; /?初始化Gtk+庫?/ gtk_init(&&argc,&&argv); /?初始化window構件?/ window=gtk_window_new(GTK_WINDOW_TOPLEVEL); /?初始化label構件?/ label=gtk_label_new("hello!"); /?將標籤放入視窗內,函式內用GTK_CONTAINER宏將視窗構?/ /?件的指標型別轉換為其父類容器構件的指標型別?/ gtk_container_add(GTK_CONTAINER(window),label); /?顯示label構件?/ gtk_widget_show(label); /?顯示window構件?/ gtk_widget_show(window); /?當視窗獲得'delete_event'訊息時呼叫close_windw函式?/ gtk_signal_connect(GTK_OBJECT(window),"delete_event", GTK_SIGNAL_FUNC(close_window),NULL); /?gtk事件迴圈?/ gtk_main(); } 6. 編譯原始碼及執行程式 最後談一下Gtk+在程式編譯和執行時有哪些特別之處。在Linux系統下的C編譯器,如gcc,要求編譯時在編譯命令後加上各種引數,如果引數太複雜,最好把命令寫入makefile檔案。 前面我們講過在應用程式檔案中用到Gtk+函式或定義的每一部分必須包含gtk/gtk.h檔案,它是Gtk+的主要包含檔案。此外,還必須連線若干庫。Gtk+的開發人員為我們提供了方便。使用gtk-config程式可以簡化這些工作。編譯hello.c原始檔成為可執行檔案hello的命令如下: gcc hello.c -o hello `gtk-config -cflags``gtk-config -libs` 注意,程式中一定是反引號(在鍵盤上位於字元1的左邊)。`gtk-config`實際執行了gtk-config程式;引數-cflags輸出編譯標誌,並將它們插入命令列;引數-libs輸出連線標誌並插入命令列。在Gtk+ 1.2以上版本中包含gtk-config程式。在Linux的命令列提示符後敲入`gtk-config -cflags`和`gtk-config -libs`表示給gcc 傳遞引數的正確方法。 用shell命令“chmod -777 hello”將檔案hello設定為所有使用者都可執行的檔案,再用shell命令“./hello”執行這個檔案。 三、小結 本文僅提供了對Gtk+庫應用的基本思路,對於想利用Gtk+開發Linux應用的C程式設計師來說是入門的一課,深入的應用和開發技巧需要讀者在今後不斷的實踐中獲得
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945003/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- flatpak 和 snap 是 Linux 上的應用軟體打包方式Linux
- PDA應用軟體開發特點
- 探討敏捷開發在軟體開發中的應用敏捷
- 用Ruby來開發GUI程式GUI
- 如何讓軟體開發從功能測試轉入應用測試?
- Linux應用開發自學之路Linux
- 去中心化社交軟體ktalk開發技術應用中心化
- “區塊鏈+”應用軟體系統開發多少錢區塊鏈
- DAPP系統開發,去中心化應用軟體搭建APP中心化
- 【轉載】App Inventor 開發BLE應用APP
- 區塊鏈技術應用資料上鍊儲存軟體系統開發區塊鏈
- Rust GUI庫 egui 的簡單應用RustGUI
- 短視訊軟體開發,日期時間控制元件的應用控制元件
- 軟體工程方法論對軟體開發有多大的用處?軟體工程
- 50款教育類開源應用軟體
- ThottleStop 軟體的應用場景
- iOS開發實用軟體之NWPusheriOS
- 學python用什麼軟體開發Python
- RabbitMQ的開發應用MQ
- 一套完整的.net WEB應用軟體快速開發解決方案Web
- 應用模型開發指南上新介紹模型
- 傳統的 Linux 軟體包格式不適合現代應用Linux
- 卓懿應用商城帶來Linux上的視聽新體驗Linux
- 社交IM聊天軟體開發app,區塊鏈技術應用落地開發方案APP區塊鏈
- 用vscode開發vue應用VSCodeVue
- 專案管理軟體的應用分析專案管理
- Mac如何清理應用軟體Mac
- UWP 開發初階 Chapter 15 - UWP 軟體打包與上傳發布到應用商店的簡單流程介紹APT
- 我用 PHP 開發的 webdav 協議的軟體 phpdavPHPWeb協議
- Coherence X for mac(將網站轉應用程式軟體) v3.2.2啟用版Mac網站
- 叫板蘋果谷歌,微軟將開發者應用分成上調至 95%蘋果谷歌微軟
- Coherence X for Mac,將網站轉換為應用程式軟體Mac網站
- Qt5 GUI 開發的應用易受遠端程式碼執行漏洞的影響QTGUI
- 區塊鏈社交直播app軟體開發,區塊鏈技術應用落地開發區塊鏈APP
- 區塊鏈IM社交直播軟體開發方案,區塊鏈技術應用開發區塊鏈
- 感測器,硬體,系統,驅動,應用軟體的發展
- 協同軟體的實際應用和技術發展
- elasticsearch的開發應用(3)Elasticsearch
- workerman結合laravel開發線上聊天應用Laravel