国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Linux下使用Gtk+/Glade進(jìn)行GUI編程的研究*

2013-01-10 10:15:14王繼魁
關(guān)鍵詞:圖形化C語(yǔ)言插件

王繼魁

(吉林師范大學(xué) 計(jì)算機(jī)學(xué)院,吉林 四平 136000)

目前,Linux作為應(yīng)用最廣泛的免費(fèi)、開源的操作系統(tǒng),已經(jīng)被越來(lái)越多的人所認(rèn)可.Linux下的圖形化系統(tǒng)X Widnows,使原本只有命令行操作的管理方式的Linux增添了圖形化的操作方式,增強(qiáng)了Linux的易用性,降低了Linux入門的門檻.GNOME和KDE是Linux下最流行的圖形化系統(tǒng).KDE是一個(gè)基于Qt GUI庫(kù)的開源桌面環(huán)境,KDE是采用GPL規(guī)范進(jìn)行發(fā)行的,但底層基礎(chǔ)的Qt卻是一個(gè)非GPL商業(yè)軟件,這就增加了Qt的局限性;GNOME選擇完全遵循GPL的GTK圖形界面為基礎(chǔ),因此得到了商業(yè)公司的廣泛支持.

本文主要介紹了基于Linux的GNOME桌面環(huán)境下GTK+開發(fā)庫(kù)的基本知識(shí)及使用方法.雖然GTK+可采用C語(yǔ)言等過(guò)程化程序設(shè)計(jì)語(yǔ)言,但能通過(guò)GObject庫(kù)支持對(duì)象和面向?qū)ο缶幊?,可以使用相?yīng)的構(gòu)件,構(gòu)造出圖形化的用戶界面.文中通過(guò)一個(gè)實(shí)例課件程序演示了利用Glade界面生成器開發(fā)基于GTK+工具的GUI應(yīng)用程序的步驟和方法.

1 GTK+簡(jiǎn)介

GTK+一開始是作為流行的GNU圖像處理程序GIMP的一部分產(chǎn)生的,這也是GTK得名的原因(Gimp ToolKit的縮寫).因?yàn)镚TK+已經(jīng)逐漸發(fā)展成功能最強(qiáng)大和最受歡迎的工具包之一,所以GIMP程序設(shè)計(jì)者頗有遠(yuǎn)見(jiàn)地將GTK+變?yōu)橐粋€(gè)獨(dú)立的項(xiàng)目.

盡管GTK+是一個(gè)與GIMP一樣的GNU項(xiàng)目,但它使用的是更自由的LGPL許可證(Lesser General Public License).LGPL允許人們使用GTK+來(lái)編寫軟件(包括源代碼不開放的私有軟件)而不用支付任何使用費(fèi)、版稅,并且不受其他的限制.GTK+許可證所提供的自由度與它的競(jìng)爭(zhēng)者Qt恰成對(duì)比,后者的GPL許可證禁止使用Qt開發(fā)商業(yè)軟件.

GTK+完全是用C語(yǔ)言編寫的,而且絕大多數(shù)GTK+軟件也是用C語(yǔ)言編寫的.但可以在許多其它語(yǔ)言中使用GTK+,如C++、Python、PHP、Ruby、Perl、C#、Java.

2 GTK+對(duì)象系統(tǒng)

盡管GTK+是完全用C語(yǔ)言編寫的,但是它通過(guò)GObject庫(kù)支持對(duì)象和面向?qū)ο缶幊?這個(gè)庫(kù)通過(guò)宏來(lái)支持對(duì)象繼承和多態(tài).每一個(gè)GTK+的GUI元素都是由一個(gè)或許多個(gè)“widgets”對(duì)象構(gòu)成的.所有的widgets都從基類GtkWidget派生.例如,應(yīng)用程序的主窗口是GtkWindow類widget,窗口的工具條是GtkToolbar類widget.一個(gè)GtkWindow是一個(gè)GtkWidget,但一個(gè)GtkWidget并不是一個(gè)GtkWindow,子類widgets繼承自父類并擴(kuò)展了父類的功能而成為一個(gè)新類,這就是標(biāo)準(zhǔn)的面向?qū)ο缶幊趟枷?我們可以查閱GTK+參考手冊(cè)找到widgets直接的繼承關(guān)系.對(duì)于GtkWindow它的繼承鏈如下:

GObject

+----GInitiallyUnowned

+----GtkObject、

+----GtkWidget

+----GtkContainer

+----GtkBin

+----GtkWindow

因此,GtkWindow繼承自GtkBin,GtkBin繼承自GtkContainer,等等.

3 GTK+的事件、信號(hào)和回調(diào)函數(shù)

所有的GUI庫(kù)都必須存在預(yù)設(shè)的機(jī)制來(lái)響應(yīng)用戶動(dòng)作并運(yùn)行對(duì)應(yīng)的程序.GTK+是一個(gè)事件驅(qū)動(dòng)的工具包,程序運(yùn)行時(shí)它會(huì)等在gtk_main()函數(shù)上,當(dāng)用戶觸發(fā)下一事件后,才把控制權(quán)傳給適當(dāng)?shù)暮瘮?shù).GTK+的事件響應(yīng)機(jī)制稱為信號(hào)回調(diào)函數(shù).當(dāng)用戶觸發(fā)下一事件,如單擊鼠標(biāo)左鍵,被按的構(gòu)件會(huì)“發(fā)出”適當(dāng)?shù)男盘?hào).即通過(guò)“信號(hào)”來(lái)傳遞程序的控制權(quán).要設(shè)置信號(hào)和回調(diào)函數(shù)之間的關(guān)聯(lián)才能讓構(gòu)件完成相應(yīng)的動(dòng)作.可以這樣設(shè)置回調(diào)函數(shù):

void a_callback_function(GtkWidget *widget,gpointer user_data);

其中傳遞了兩個(gè)參數(shù):第一個(gè)參數(shù)是指向發(fā)出信號(hào)的構(gòu)件指針,第二個(gè)參數(shù)是當(dāng)你連接回調(diào)函數(shù)時(shí)自己選擇的一個(gè)任意指針.

只需要調(diào)用g_signal_connect()函數(shù)就可以設(shè)置信號(hào)與回調(diào)函數(shù)之間的連接.其語(yǔ)法格式如下:

gulong g_singal_connect(gpointer *object,

const gchar *name,

GCallback func,

Gpointer user_data);

第一個(gè)參數(shù)是要發(fā)出信號(hào)的構(gòu)件,第二個(gè)參數(shù)是你想要連接的信號(hào)的名稱,第三個(gè)參數(shù)是信號(hào)被捕獲時(shí)所要調(diào)用的函數(shù),第四個(gè)參數(shù)是你想傳遞給這個(gè)函數(shù)的數(shù)據(jù).

連接函數(shù)沒(méi)有任何限制,可以將多個(gè)信號(hào)連接到同一個(gè)回調(diào)函數(shù),也可以將多個(gè)回調(diào)函數(shù)連接同一個(gè)信號(hào).

4 GMoudle

動(dòng)態(tài)鏈接庫(kù)是Linux系統(tǒng)核心中的重要組成部分,插件則可以將應(yīng)用程序的不同的功能放在動(dòng)態(tài)鏈接庫(kù)中進(jìn)行單獨(dú)的管理;關(guān)鍵的一點(diǎn)是插件不像動(dòng)態(tài)鏈接庫(kù)那樣,由操作系統(tǒng)來(lái)統(tǒng)一裝載和卸載;而是由應(yīng)用程序自己來(lái)裝載,這樣就減輕了系統(tǒng)資源的占用,也增強(qiáng)了應(yīng)用程序的靈活性.

GTK+的底層基礎(chǔ)GLib中提供了插件編程功能,稱為GMoudle.它為實(shí)現(xiàn)插件功能提供了快捷的方法,用非常簡(jiǎn)單的方法實(shí)現(xiàn)了動(dòng)態(tài)加載插件和調(diào)用插件中的函數(shù)的功能.

如果你編寫的應(yīng)用程序要用到GModule插件功能,就必須在編譯時(shí)加入`pkg-config--libs gmoudle-2.0`以完成最后程序運(yùn)行的需要.

5 Glade簡(jiǎn)介

Glade是一種開發(fā)GTK+應(yīng)用程序的RAD(Rapid Application Development)工具.Glade自身就是一個(gè)GTK+應(yīng)用程序,因?yàn)樗褪怯肎TK+開發(fā)出來(lái)的.Glade用來(lái)簡(jiǎn)化UI控件的設(shè)計(jì)和布局操作,進(jìn)行快速開發(fā).Glade的設(shè)計(jì)初衷是把界面設(shè)計(jì)與應(yīng)用程序代碼相分離,界面的修改不會(huì)影響到應(yīng)用程序代碼,Glade設(shè)計(jì)的界面保存為glade格式文件,它實(shí)際上是一種XML文件.Glade起初能根據(jù)創(chuàng)建的GUI自動(dòng)生成C語(yǔ)言代碼,然后利用Libglade庫(kù)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建界面.如今的Glade3沒(méi)有繼承以上的方法.因?yàn)?,Glade需要做的唯一的事就是生成一個(gè)描述如何創(chuàng)建GUI的glade文件.這給編程人員提供了更多的靈活性和易用性,避免因用戶界面部分微小的改變就要重新編譯整個(gè)應(yīng)用程序;同時(shí)使其和程序設(shè)計(jì)語(yǔ)言無(wú)關(guān),幾乎所有的編程語(yǔ)言都可以使用Glade.

6 實(shí)例

本實(shí)例主要實(shí)現(xiàn)生成哈希碼的教學(xué)程序.GUI主要由一個(gè)菜單欄、兩個(gè)文本框、兩個(gè)按鈕、一個(gè)狀態(tài)欄組成.實(shí)現(xiàn)的程序用C語(yǔ)言編寫,在Xwindows環(huán)境下調(diào)用glade設(shè)計(jì)GUI界面.實(shí)現(xiàn)過(guò)程如下:

6.1 GUI界面設(shè)計(jì)

確定系統(tǒng)安裝了glade3包.本例使用的是glade3-3.8.2.在Xwindows圖形界面下,從Applications菜單下的programming子菜單中選擇Glade Interface Designer.

圖1 Glade的設(shè)計(jì)界面

調(diào)出glade3界面如圖1所示.在工具欄下界面主要分為三部分.左端是palette窗口,是glade的圖形構(gòu)件的集合;中間是設(shè)計(jì)界面的工作區(qū)域;右端分為上下兩部分,上部是inspector窗口,顯示設(shè)計(jì)的構(gòu)件樹,下部是properties窗口,顯示的構(gòu)件各種屬性.設(shè)計(jì)中用到了GtkVBox、GtkHBox、GtkMenuBar、GtkEntry、GtkEntry、GtkStatusbar等構(gòu)件.設(shè)計(jì)好后,保存為hasher.glade.

為保證glade文件和程序需要的xml文件格式相匹配,在Linux文本狀態(tài)下執(zhí)行如下命令:

gtk-builder-convert hasher.glade hasher.xml

6.2 程序編寫

主要代碼如下:

#include

#include //MD5 hash

typedef struct {//程序的構(gòu)件

GtkWidget *window1;

GtkWidget *entry1;

GtkWidget *entry2;

GtkWidget *label1;

} AppWidgets;

void check_hash(UNUSED,AppWidgets *app){…}//驗(yàn)證哈希碼函數(shù)

void generate_hash(UNUSED,AppWidgets *app){…}//生成哈希碼函數(shù)

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

GtkBuilder *builder;

AppWidgets*app=g_slice_new(AppWidgets);

gtk_init(&argc,&argv);

builder=gtk_builder_new();

gtk_builder_add_from_file(builder,“hasher.xml”,&err);

//取得構(gòu)件句柄

#define appGET(xx)〗app->xx=GTK_WIDGET(gtk_builder_get_object(builder,#xx))

appGET(entry1);appGET(entry2);appGET(label1);appGET(window1);

gtk_builder_connect_signals(builder,app);//回調(diào)函數(shù)

g_object_unref(G_OBJECT(builder));

gtk_main();

g_slice_free(AppWidgets,app);

return 0;

}

6.3 信號(hào)回調(diào)方法

信號(hào)回調(diào)的過(guò)程分兩階段:

①在Glade設(shè)計(jì)時(shí),signal選項(xiàng)卡中指定的回調(diào)函數(shù)應(yīng)該在信號(hào)發(fā)出時(shí)被調(diào)用.

②在程序運(yùn)行時(shí),回調(diào)函數(shù)的調(diào)用分兩種方式.第一種方式是使用gtk_builder_connect_signals()函數(shù),此函數(shù)能自動(dòng)查找與主程序中相匹配的回調(diào)函數(shù)并予以調(diào)用,整個(gè)過(guò)程通過(guò)GModule來(lái)實(shí)現(xiàn);第二種方式是使用gtk_builder_connect_signals_full()函數(shù),此函數(shù)是需要用戶自己指定哪個(gè)回調(diào)函數(shù)被調(diào)用.

該程序是使用了第一種方式自動(dòng)匹配回調(diào)函數(shù),使用自動(dòng)化的過(guò)程減少人工編寫代碼的繁瑣過(guò)程.

6.4 Makefile文件的編寫

Makefile文件是由一組依賴關(guān)系和規(guī)則構(gòu)成.每個(gè)依賴關(guān)系由一個(gè)目標(biāo)和一組該目標(biāo)所依賴的源文件組成.而規(guī)則描述了如何通過(guò)這些依賴文件創(chuàng)建目標(biāo).本實(shí)例的Makefile文件如下.

NAME=hasher

INCLUDES=-I.

CFLAGS=-g-Wall-pedantic$(shell pkg-config--cflags--libs gtk+2.0 gmodule-export-2.0) -export-dynamic -std=c99 -lcrypto

all:

gcc ${CFLAGS} -c ${NAME}.c -o ${NAME}.o

gcc ${NAME}.o -o ${NAME} ${CFLAGS}

clean:

rm -f ${NAME}

編寫好Makefile文件后,運(yùn)行make命令來(lái)進(jìn)行編譯和連接.最后,在Xwindows的終端窗口里輸入./hasher運(yùn)行程序,運(yùn)行結(jié)果如圖2.

圖2 程序運(yùn)行結(jié)果

隨著Linux操作系統(tǒng)圖形化進(jìn)程的推進(jìn),對(duì)GUI應(yīng)用程序的需求量也會(huì)越來(lái)越大.本文介紹GTK+和Glade的基本內(nèi)容,通過(guò)一個(gè)課件實(shí)例程序演示了利用Glade界面生成器開發(fā)基于GTK+工具的GUI應(yīng)用程序的步驟和方法,對(duì)Linux下的GUI應(yīng)用程序的開發(fā)具有一定的指導(dǎo)性.

參考文獻(xiàn):

[1]Neil Matthew,Richard Stones Beginning Linux Programming[M].4th Edition Wilery Publishing,Inc.,2008.

[2]The GTK+Project[EB/OL].The GTK+Project http://www.gtk.org/

[3]Glade-A User Interface Designer[EB/OL].Glade-A User Interface Designer http://glade.gnome.org/

猜你喜歡
圖形化C語(yǔ)言插件
基于Visual Studio Code的C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)探索
自編插件完善App Inventor與樂(lè)高機(jī)器人通信
電子制作(2019年22期)2020-01-14 03:16:34
基于C語(yǔ)言的計(jì)算機(jī)軟件編程
電子制作(2018年16期)2018-09-26 03:27:08
LKJ自動(dòng)化測(cè)試系統(tǒng)圖形化技術(shù)研究
高職高專院校C語(yǔ)言程序設(shè)計(jì)教學(xué)改革探索
運(yùn)用圖形化聽(tīng)寫式復(fù)習(xí),構(gòu)建高效地理課堂
MapWindowGIS插件機(jī)制及應(yīng)用
論子函數(shù)在C語(yǔ)言數(shù)據(jù)格式輸出中的應(yīng)用
基于Revit MEP的插件制作探討
圖形化地區(qū)電網(wǎng)無(wú)功優(yōu)化軟件開發(fā)與應(yīng)用
台安县| 云龙县| 兴山县| 景洪市| 山东| 旺苍县| 宜章县| 金门县| 深水埗区| 永兴县| 鲜城| 永福县| 和硕县| 鄂伦春自治旗| 寿阳县| 湖州市| 黄冈市| 阳山县| 舞阳县| 武隆县| 勐海县| 紫阳县| 丁青县| 松潘县| 柘城县| 安陆市| 德化县| 肥城市| 手游| 正安县| 建昌县| 深州市| 四平市| 东兰县| 博野县| 广南县| 佳木斯市| 丰都县| 祁阳县| 丹寨县| 大渡口区|