基于嵌入式 Qt 的車(chē)載 GUI 平臺的設計
1 引言
隨著(zhù)經(jīng)濟社會(huì )的不斷發(fā)展汽車(chē)已進(jìn)入普通家庭,汽車(chē)用戶(hù)對車(chē)載娛樂(lè )系統的要求不斷地提高,希望汽車(chē)載娛樂(lè )系統的功能更加強大娛樂(lè )設施更加完美。嵌入式GUI(Graphical User InteRFace)可以滿(mǎn)足用戶(hù)需求,人機交互好,作為車(chē)載娛樂(lè )系統中人機交互界面的開(kāi)發(fā)平臺,對整個(gè)系統的設計起著(zhù)決定性作用,越來(lái)越受到開(kāi)發(fā)者的青睞。目前比較流行的GUI平臺有Qt/Embedded、緊縮的X Windows系統、MicroWindows以及MiniGUI系統。
X Window系統是一個(gè)基于客戶(hù)/服務(wù)器(Client/Server)結構的視窗系統,基于X的終端(服務(wù)器)上顯示出來(lái)。此系統配置在大多數的UNIX系統、DEC的VAX/VMS操作系統以及Linux系統中,可以自由拷貝以及傳播,但是系統龐大,占用內核資源較多。MicroWindows是一個(gè)完全開(kāi)放源碼、分層設計的經(jīng)典GUI系統,可以替代X Window系統,但是某些關(guān)鍵性代碼使用了匯編語(yǔ)言。MiniGUI系統適應于中小型企業(yè)的嵌入式GUI平臺,采用分層結構,并在核心層采用hash表的方式。本文采用的Qt/Embedded也是分層體系結構,在功能提供方面采用C++類(lèi)方式。
2 嵌入式GUI的實(shí)現平臺
GUI是圖形用戶(hù)接口,一般用于PC機上人機交互界面的設計。而對于嵌入式GUI來(lái)說(shuō),由于嵌入式設備對資源的要求很?chē)栏?,不同的嵌入式設備需要定制不同的嵌入式系統,那么對GUI的要求也就不一樣,因此,對于不同的嵌入式系統來(lái)說(shuō)GUI也必須是可定制的。對于嵌入式的硬件來(lái)說(shuō),要求定制的嵌入式GUI應具有輕型、占用資源少、性能高、可靠性高、可配置等特點(diǎn)。由于Linux操作系統具有源碼公開(kāi)性、可移植性、可裁剪性和靈活性等優(yōu)點(diǎn),所以嵌入式GUI的開(kāi)發(fā)常在Linux環(huán)境下進(jìn)行。
Qt/Embedded是著(zhù)名的Qt庫開(kāi)發(fā)商正在進(jìn)行的面向嵌入式系統的Qt版本。它是專(zhuān)門(mén)為嵌入式系統設計圖形用戶(hù)界面的工具包,包括一個(gè)完整的窗口系統。它的特點(diǎn)是可移植性比較好,設計者能輕易的加入各種顯示設備和硬件輸入設備,很多基于Qt的XWindow都可以非常方便的移植到嵌入式版本。
Qt/Embedded為開(kāi)發(fā)者提供了豐富的API調用功能,并公開(kāi)源代碼。Qt/Embedded提供了非常豐富的窗口小部件(Widgets),并且還支持窗口部件的定制,因此它可以為用戶(hù)提供漂亮的圖形界面,但同時(shí)豐富的窗口對象也增大了軟件的體積,所以,Qt/Embedded一般用于對運行環(huán)境不太苛刻的嵌入式設備中。
3 嵌入式Qt系統的特點(diǎn)
Qt/Embedded移植了大量的原來(lái)基于Qt的XWindows程序,并提供了非常完整的嵌入式GUI解決方案,是一個(gè)成熟的GUI平臺,具有如下特點(diǎn):
(1)Qt遵循GPL協(xié)議,開(kāi)放主要的源代碼,用戶(hù)可以在GPL的規定下自由添加新特性。
(2)與其他嵌入式GUI相比,嵌入式Qt不僅是一個(gè)完整的窗口系統,而且也是一個(gè)應用程序框架,這更有利于應用程序的開(kāi)發(fā)。
(3)Qt具有豐富的API,包括多達250個(gè)以上的C++類(lèi),支持諸如對圖形、網(wǎng)絡(luò )、數據庫、I/O操作、各種控件和XMI等眾多功能,可滿(mǎn)足大多數嵌入式應用系統開(kāi)發(fā)的需要。
(4)Qt是一個(gè)GUI仿真工具包,它使用各自平臺上的低級繪圖函數仿真MS Windows和Motif(商用Llnix的標準GUI庫),因此程序運行速度快。
(5)Qt良好的封裝機制使得Qt的模塊化程度非常高,可靠性好,易于程序開(kāi)發(fā)。
基于Qt的這些特點(diǎn),在本車(chē)載嵌入式娛樂(lè )系統的開(kāi)發(fā)過(guò)程中,本文采用了嵌入式Qt作為圖形用戶(hù)界面開(kāi)發(fā)的GUl支持平臺,有效提高了應用程序的開(kāi)發(fā)速度。
4 基于嵌入式Qt的車(chē)載GUI的設計
4.1 基于嵌入式Qt的車(chē)載GUI的總體設計
基于Linux的車(chē)載娛樂(lè )系統運行環(huán)境如表l所示,底層由Linux內核和驅動(dòng)程序構成。該內核是經(jīng)過(guò)裁減過(guò)的嵌入式Linux2.4,其中包括
基于嵌入式Qt的車(chē)載嵌入式娛樂(lè )系統軟件,最大限度的滿(mǎn)足了車(chē)載視聽(tīng)娛樂(lè )的要求。提供視頻播放、音頻播放等多媒體軟件,個(gè)人信息管理軟件,無(wú)線(xiàn)網(wǎng)絡(luò )服務(wù)等。其系統架構如圖l所示。
4.2 基于嵌入式Qt的窗口系統結構設計
本文設計的上層GUI窗口系統采用了客戶(hù)/服務(wù)器系統結構。該窗口系統包括:一個(gè)服務(wù)器進(jìn)程、一個(gè)或者多個(gè)客戶(hù)進(jìn)程。服務(wù)器負責為客戶(hù)和本身分配顯示區域,生成鼠標、鍵盤(pán)或者觸摸屏事件,它通常包含那些啟動(dòng)客戶(hù)的用戶(hù)界面。而客戶(hù)則通過(guò)與服務(wù)器通信來(lái)申請顯示區域,接受鼠標或觸摸屏事件??蛻?hù)可以直接訪(fǎng)問(wèn)所分配的顯示區域,以便為用戶(hù)提供GUI服務(wù)。服務(wù)器和客戶(hù)通過(guò)共享內存的方式來(lái)傳遞所分配顯示區域上的信息。窗口系統體系結構如圖2所示。
服務(wù)器(進(jìn)程)維護著(zhù)一組區域,當窗口被創(chuàng )建、移動(dòng)、改變大小和破壞時(shí),通過(guò)這組區域來(lái)改變每個(gè)客戶(hù)的申請。該區域存放在共享內存中,在執行繪圖操作時(shí),客戶(hù)可以從中讀取信息;服務(wù)器連接著(zhù)一些系統設備,如鼠標、鍵盤(pán)或者觸摸屏,服務(wù)器負責將這些設備所產(chǎn)生的事件發(fā)送到適當的客戶(hù)進(jìn)程。服務(wù)器能夠生成一個(gè)設備獨立的鼠標或鍵盤(pán)事件,并將其發(fā)送到相應的客戶(hù)進(jìn)程。觸筆設備通常沒(méi)有鼠標光標,但是觸筆操作能轉化為設備獨立的鼠標事件,然后由客戶(hù)以標準事件進(jìn)行處理。
嵌入式Qt為客戶(hù)(進(jìn)程)提供API,當客戶(hù)使用Qt API畫(huà)線(xiàn)時(shí),QT/Embedded庫能直接訪(fǎng)問(wèn)顯存,完成畫(huà)線(xiàn)工作;在一些情況下嵌入式Qt客戶(hù)庫需要與服務(wù)器進(jìn)程建立連接,如在客戶(hù)進(jìn)程啟動(dòng)時(shí),發(fā)生了會(huì )影響到全局后果的操作而與服務(wù)器通信時(shí)。例如,當客戶(hù)進(jìn)行了拖放操作后,由于窗口覆蓋而導致顯示區域的變化,則從用戶(hù)那里接收到鼠標和鍵盤(pán)事件時(shí)就需要建立這樣的連接;嵌入式Qt客戶(hù)庫負責處理所有的繪畫(huà)操作,包括文本顯示和字體處理等。
4.3 基于嵌入式Qt的事件響應設計
在前述的客戶(hù)/服務(wù)器系統結構中,每個(gè)鍵的按下、釋放都以QWSKeyEvent事件發(fā)出。一個(gè)QWSKeyEvent事件通常包括以下各域:
- Unicode:Unicode值。
- Keycode:Qt鍵碼值,定義在qnamespace.h頭文件中。
- Modifier:位域, 包括Qt::ShiftButton,Qt::ControlButton和Qt::AltButton。
- Is press:鍵按下時(shí)為真,釋放時(shí)為假。
- Is auto repeat:鍵處于自動(dòng)重復狀態(tài)時(shí)為真。
嵌入式Qt處理鍵事件的過(guò)程為:鍵盤(pán)驅動(dòng)程序負責從設備中讀取數據,并將鍵事件發(fā)送到服務(wù)器中。當服務(wù)器從鍵盤(pán)驅動(dòng)程序接收到一個(gè)鍵事件時(shí),它首先要經(jīng)過(guò)一個(gè)事件過(guò)濾器,然后再將其發(fā)送至每個(gè)客戶(hù)進(jìn)程,最后由客戶(hù)進(jìn)程負責處理鍵事件,并將其發(fā)送到適當的窗口。具體流程如圖3所示。
這里,鍵事件未必都來(lái)自鍵盤(pán)設備,包括觸摸屏,觸筆都可以產(chǎn)生鍵事件。服務(wù)器在任何時(shí)候都可以調用函數QWSServer::sendKeyEvent()產(chǎn)生鍵事件。根據這個(gè)特點(diǎn),再結合事件過(guò)濾器的特性,便可構造出所需的輸入服務(wù)器平臺。
在Qt中,一個(gè)事件通過(guò)調用QObject::event()被發(fā)送到繼承自QObject的對象。事件發(fā)送就是一個(gè)事件已經(jīng)產(chǎn)生,由QEvent正好去表達,且QObject需要去回應。多數事件來(lái)自窗口系統類(lèi)QWidget,如QMouseEvent,QkeyEvent事件。某些事件來(lái)自其他源頭,如QTimerEvent,而某些來(lái)自應用程序,Qt會(huì )一視同仁的處理。
事件過(guò)濾器在目標對象處理之前去處理事件。過(guò)濾器通過(guò)調用QObject::eventFilter()實(shí)現,它可以接受或丟棄過(guò)濾,也可容許或拒絕進(jìn)一步去處理事件。如果所有的事件過(guò)濾器允許進(jìn)一步的處理事件,事件自己就被送達目標對象。本文在服務(wù)器進(jìn)程中安排事件過(guò)濾器,接收鍵事件,經(jīng)過(guò)處理后,將結果發(fā)送到客戶(hù)進(jìn)程。在客戶(hù)進(jìn)程中,處理鍵事件,并發(fā)送到適當的窗口中。
5 結語(yǔ)
嵌入式Linux是目前流行的嵌入式系統解決方案,而嵌入式GUI是嵌入式Linux不可缺少的組成部分。本文通過(guò)分析、比較目前流行的幾種嵌入式GUI,選擇了嵌入式Qt作為研究對象并對其進(jìn)行了深入討論,在此基礎上完成了基于嵌入式Qt的車(chē)載GUI的設計和實(shí)現,具有較高的經(jīng)濟價(jià)值,并可為其他嵌入式娛樂(lè )系統提供參考價(jià)值。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論