基于Qt/E的嵌入式GUI的研究及其移植
服務(wù)器:服務(wù)器維護(hù)著一組區(qū)域,當(dāng)窗口被創(chuàng)建、移動、改變大小和破壞時,通過這組區(qū)域來改變每個客戶的申請。該區(qū)域存放在共享內(nèi)存中,在執(zhí)行繪圖操作時,客戶可以從中讀取信息;客戶:嵌入式Qt為客戶提供的API與標(biāo)準(zhǔn)的Qt API是一致的。當(dāng)Qt/E客戶使用Qt API畫線時,Qt/E庫直接訪問顯存,完成畫線工作。嵌入式Qt客戶庫還負(fù)責(zé)處理所有的繪畫操作,另外,他還處理那些定制的窗口裝飾(如標(biāo)題條等)。
3.1.3 Qt/E圖形引擎的實現(xiàn)
Qt/E的底層圖形引擎基于幀緩沖(frame buffer)。幀緩沖是標(biāo)準(zhǔn)顯示設(shè)備驅(qū)動接口,使用MMAP系統(tǒng)將幀緩存映射到應(yīng)用程序虛擬內(nèi)存空間,這樣應(yīng)用程序可以訪問它。
幀緩沖驅(qū)動程序的實現(xiàn)分為兩個方面,一方面是LCD等相關(guān)硬件及緩存的初始化,包括圖形在緩沖區(qū)的創(chuàng)建和設(shè)置DMA通道;另外一方面是對畫面緩沖區(qū)的讀寫,read、write及l(fā)seek等系統(tǒng)調(diào)用接口可以調(diào)用驅(qū)動程序的讀寫函數(shù)。至于將畫面緩沖區(qū)的內(nèi)容輸出到LCD顯示屏上,則由硬件自動完成。當(dāng)設(shè)置DMA通道和畫面緩沖區(qū)后,DMA開始正常工作并將緩沖區(qū)中的內(nèi)容不斷發(fā)送到LCD上,這個過程基于DMA對于LCD的不斷刷新。幀緩沖驅(qū)動程序則將數(shù)據(jù)寫入幀緩存中,這通過映射MMAP來實現(xiàn)[2]。
在Qt/E中,QScreen類為抽象出的底層顯示設(shè)備基類,其中聲明了對于顯示設(shè)備的基本描述和操作方式,如打開、關(guān)閉、獲得顯示能力、創(chuàng)建 GFX操作對象等。另外一個重要的基類是QGFX類。該類抽象出對于顯示設(shè)備的具體操作接口(圖形設(shè)備環(huán)境),如選擇畫刷、畫線、畫矩形、alpha操作等。以上兩個基類是Qt/E圖形引擎的底層抽象,其中許多函數(shù)是虛函數(shù)。當(dāng)具體的顯示設(shè)備(如具體的幀緩沖設(shè)備和虛擬幀緩沖設(shè)備)從其派生類時,這些派生類會繼承并重載基類中的虛函數(shù)來實現(xiàn)[3]。
3.2 Qt系統(tǒng)的信號與槽(Signal and Slot)機(jī)制
信號/槽是一種高級接口,應(yīng)用于對象之間的通信,是Qt的核心特性,也是Qt區(qū)別于其他工具包的重要地方。信號/槽是Qt自行定義的一種通信機(jī)制,獨立與標(biāo)準(zhǔn)的C/C++語言,因此要正確的處理信號和槽,必須借助于一個稱為MOC(Meta Object Compiler)的Qt工具,該工具是一個C++預(yù)處理程序,它為高層次的事件處理自動生成所需要的附加代碼。
Qt中使用信號/槽機(jī)制替代原始回調(diào)和消息映射機(jī)制。當(dāng)一個特定事件發(fā)生的時候,一個信號被發(fā)射。Qt的窗口部件有很多預(yù)定義的信號,但是程序員總是可以通過繼承來加入自定義的信號。槽就是一個可以被調(diào)用處理特定信號的函數(shù)。Qt的窗口部件有很多預(yù)定義的槽,但是通常的習(xí)慣是加入程序員自己的槽,這樣就可以處理自己所感興趣的信號。
所有從QObject或其子類派生的類都能夠包含信號和槽。當(dāng)對象改變其狀態(tài)時,信號就由該對象發(fā)射出去,這就是對象所要做的全部事情。它不知道另一端是誰在接收這個信號,這就是真正的信息封裝,它確保對象被當(dāng)作一個真正的軟件組件來使用。槽用于接收信號,但它們是普通的對象成員函數(shù)。一個槽并不知道是否有任何信號與自己相連接。而且,對象并不了解具體的通信機(jī)制,這樣就可以相對容易地開發(fā)出代碼可高重用的類[4]。
多個信號可以連接一個槽,一個信號也可以連接多個槽,甚至一個信號與另外一個信號相連接也是可能的,這時無論第一個信號什么時候發(fā)射系統(tǒng)都將立刻發(fā)射第二個信號,如圖3所示[5]。總之,信號與槽構(gòu)造了一個強(qiáng)大的部件編程機(jī)制。
圖3 信號與槽的連接
4 Qt/E的移植
在PC上基于Qt/X11和qvfb的應(yīng)用程序調(diào)試通過以后就可以將應(yīng)用程序軟件移植到目標(biāo)平臺上,但前提是要保證frame buffer、觸摸屏等驅(qū)動程序的正常運行[6]。Qt/E移植過程如下:
1) 交叉工具鏈的安裝。
本文選用的交叉工具鏈?zhǔn)莂rm-linux-gcc系列。安裝包為:cross-2.95.3.tar.bz2將其拷貝到某個目錄下,依次執(zhí)行如下命令:
tar -jxvf cross-2.95.3.tar.bz2
這個工具鏈應(yīng)該安裝的路徑是:/usr/local/arm/2.95.3(或者可以通過查看GCC版本號,可以得到一些信息,從版本信息中可以看到“-prefix=……”,這就是GCC安裝的路徑,它是在GCC編譯前通過prefix選項配置的)。
評論