Qt圖形編程基礎(chǔ)之:Qt/Embedded開發(fā)入門
12.2Qt/Embedded開發(fā)入門
12.2.1Qt/Embedded介紹
1.架構(gòu)
Qt/Embedded以原始Qt為基礎(chǔ),并做了許多出色的調(diào)整以適用于嵌入式環(huán)境。Qt/Embedded通過QtAPI與LinuxI/O設(shè)施直接交互,成為嵌入式Linux端口。同Qt/X11相比,Qt/Embedded很省內(nèi)存,因?yàn)樗恍枰粋€(gè)X服務(wù)器或是Xlib庫,它在底層拋棄了Xlib,采用framebuffer(幀緩沖)作為底層圖形接口。同時(shí),將外部輸入設(shè)備抽象為keyboard和mouse輸入事件。Qt/Embedde的應(yīng)用程序可以直接寫內(nèi)核緩沖幀,這避免開發(fā)者使用繁瑣的Xlib/Server系統(tǒng)。圖12.1所示比較了Qt/Embedded與Qt/X11的架構(gòu)區(qū)別。
使用單一的API進(jìn)行跨平臺的編程可以有很多好處。提供嵌入式設(shè)備和桌面計(jì)算機(jī)環(huán)境下應(yīng)用的公司可以培訓(xùn)開發(fā)人員使用同一套工具開發(fā)包,這有利于開發(fā)人員之間共享開發(fā)經(jīng)驗(yàn)與知識,也使得管理人員在分配開發(fā)人員到項(xiàng)目中的時(shí)候增加靈活性。更進(jìn)一步來說,針對某個(gè)平臺而開發(fā)的應(yīng)用和組件也可以銷售到Qt支持的其他平臺上,從而以低廉的成本擴(kuò)大產(chǎn)品的市場。
(1)窗口系統(tǒng)。
一個(gè)Qt/Embedded窗口系統(tǒng)包含了一個(gè)或多個(gè)進(jìn)程,其中的一個(gè)進(jìn)程可作為服務(wù)器。該服務(wù)進(jìn)程會分配客戶顯示區(qū)域,以及產(chǎn)生鼠標(biāo)和鍵盤事件。該服務(wù)進(jìn)程還能夠提供輸入方法和一個(gè)用戶接口給運(yùn)行起來的客戶應(yīng)用程序。該服務(wù)進(jìn)程其實(shí)就是一個(gè)有某些額外權(quán)限的客戶進(jìn)程。任何程序都可以在命令行上加上“-qws”的選項(xiàng)來把它作為一個(gè)服務(wù)器運(yùn)行。
客戶與服務(wù)器之間的通信使用共享內(nèi)存的方法實(shí)現(xiàn),通信量應(yīng)該保持最小,例如客戶進(jìn)程直接訪問幀緩沖來完成全部的繪制操作,而不會通過服務(wù)器,客戶程序需要負(fù)責(zé)繪制它們自己的標(biāo)題欄和其他式樣。這就是Qt/Embedded庫內(nèi)部層次分明的處理過程??蛻艨梢允褂肣COP通道交換消息。服務(wù)進(jìn)程簡單的廣播QCOP消息給所有監(jiān)聽指定通道的應(yīng)用進(jìn)程,接著應(yīng)用進(jìn)程可以把一個(gè)插槽連接到一個(gè)負(fù)責(zé)接收的信號上,從而對消息做出響應(yīng)。消息的傳遞通常伴隨著二進(jìn)制數(shù)據(jù)的傳輸,這是通過一個(gè)QDataStream類的序列化過程來實(shí)現(xiàn)的,有關(guān)這個(gè)類的描述,請讀者參考相關(guān)資料。
QProcess類提供了另外一種異步的進(jìn)程間通信機(jī)制。它用于啟動一個(gè)外部的程序并且通過寫一個(gè)標(biāo)準(zhǔn)的輸入和讀取外部程序的標(biāo)準(zhǔn)輸出和錯(cuò)誤碼來和它們通信。
(2)字體
Qt/Embedded支持4種不同的字體格式:TrueType字體(TTF),PostscriptType1字體,位圖發(fā)布字體(BDF)和Qt的預(yù)呈現(xiàn)(Pre-rendered)字體(QPF)。Qt還可以通過增加Qfont-
Factory的子類來支持其他字體,也可以支持以插件方式出現(xiàn)的反別名字體。
每個(gè)TTF或者TYPE1類型的字體首次在圖形或者文本方式的環(huán)境下被使用時(shí),這些字體的字形都會以指定的大小被預(yù)先呈現(xiàn)出來,呈現(xiàn)的結(jié)果會被緩沖。根據(jù)給定的字體尺寸(例如10或12點(diǎn)陣)預(yù)先呈現(xiàn)TTF或者TYPE1類型的字體文件并把結(jié)果以QPF的格式保存起來,這樣可以節(jié)省內(nèi)存和CPU的處理時(shí)間。QPF文件包含了一些必要的字體,這些字體可以通過makeqpf工具取得,或者通過運(yùn)行程序時(shí)加上“-savefonts”選項(xiàng)獲取。如果應(yīng)用程序中使用到的字體都是QPF格式,那么Qt/Embedded將被重新配置,并排除對TTF和TYPE1類型的字體的編譯,這樣就可以減少Q(mào)t/Embedded的庫的大小和存儲字體的空間。例如一個(gè)10點(diǎn)陣大小的包含所有ASCII字符的QPF字體文件的大小為1300字節(jié),這個(gè)文件可以直接從物理存儲格式映射成為內(nèi)存存儲格式。
Qt/Embedded的字體通常包括Unicode字體的一部分子集,ASCII和Latin-1。一個(gè)完整的16點(diǎn)陣的Unicode字體的存儲空間通常超過1MB,我們應(yīng)盡可能存儲一個(gè)字體的子集,而不是存儲所有的字,例如在一個(gè)應(yīng)用中,僅僅需要以Cappuccino字體、粗體的方式顯示產(chǎn)品的名稱,但是卻有一個(gè)包含了全部字形的字體文件。
(3)輸入設(shè)備及輸入法。
Qt/Embedded3.0支持幾種鼠標(biāo)協(xié)議:BusMouse、IntelliMouse,Microsoft和MouseMan.Qt/
Embedded還支持NECVr41XX和iPAQ的觸摸屏。通過從QWSMouseHandler或者Qcalibra-
tedMouseHandler派生子類,開發(fā)人員可以讓Qt/Embedded支持更多的客戶指示設(shè)備。
Qt/Embedded支持標(biāo)準(zhǔn)的101鍵盤和Vr41XX按鍵,通過子類化QWSKeyboardHandler可以讓Qt/Embedded支持更多的客戶鍵盤和其他的非指示設(shè)備。
對于非拉丁語系字符(例如阿拉伯、中文、希伯來和日語)的輸入法,需要把它寫成過濾器的方式,并改變鍵盤的輸入。輸入法的作者應(yīng)該對全部的QtAPI的使用有完整的認(rèn)識。在一個(gè)無鍵盤的設(shè)備上,輸入法成了惟一的輸入字符的手段。Qtopia提供了4種輸入方法:筆跡識別器、圖形化的標(biāo)準(zhǔn)鍵盤、Unicode鍵盤和基于字典方式提取的鍵盤。
(4)屏幕加速
通過子類化QScreen和QgfxRaster可以實(shí)現(xiàn)硬件加速,從而為屏幕操作帶來好處。Troll-
tech提供了Mach64和Voodoo3視頻卡的硬件加速的驅(qū)動例子,同時(shí)可以按照協(xié)議編寫其他的驅(qū)動程序。
linux相關(guān)文章:linux教程
評論