新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux中基于Qt/Embedded的鍵盤接口設(shè)計(jì)

嵌入式Linux中基于Qt/Embedded的鍵盤接口設(shè)計(jì)

作者: 時(shí)間:2011-01-13 來源:網(wǎng)絡(luò) 收藏


3 Qt/Embedded輸入策略
3.1 Qt/Embedded架構(gòu)簡介
Qt/Embedded Linux應(yīng)用程序需要一個(gè)正在運(yùn)行著的服務(wù)器應(yīng)用或者是本身就是一個(gè)服務(wù)器應(yīng)用程序。任何一個(gè)Qt/Embedded Linux應(yīng)用程序都可以扮演服務(wù)器的角色。當(dāng)多于一個(gè)應(yīng)用程序運(yùn)行的時(shí)候,應(yīng)用程序作為客戶端與服務(wù)器程序相連接。
服務(wù)器進(jìn)程和客戶端進(jìn)程有不同的分工:服務(wù)器進(jìn)程管理著鼠標(biāo)指針的處理、字符的輸入和屏幕的輸出。另外服務(wù)器還控制著屏幕光標(biāo)的輸出和屏幕保護(hù)程序。客戶端進(jìn)程完成所有應(yīng)用程序的具體操作。一個(gè)QWSServer類的實(shí)例代表一個(gè)服務(wù)器應(yīng)用,一個(gè)QWSClient類的實(shí)例代表著一個(gè)客戶端應(yīng)用。每一方面都有一些類完成各種操作。
所有系統(tǒng)產(chǎn)生的事件包括事件和鼠標(biāo)事件都被傳遞到服務(wù)器應(yīng)用中,然后服務(wù)器將這些事件分發(fā)到客戶端應(yīng)用中。
3.2 客戶端/服務(wù)器的通信
如圖3所示,正在運(yùn)行著的程序通過增加和刪除窗口不斷地改變屏幕的顯示。服務(wù)器在對應(yīng)的QWSWindow對象中維護(hù)著每一個(gè)頂層窗口的信息。每當(dāng)服務(wù)器接收到一個(gè)事件時(shí),它都會(huì)查詢它的頂層窗口列表找到包含該事件位置的窗口。每一個(gè)窗口都有一個(gè)創(chuàng)建它們的客戶端應(yīng)用的ID,將這個(gè)ID返回給服務(wù)器。最后服務(wù)器將這個(gè)事件封裝成一個(gè)QWSEvent類的實(shí)例,傳遞給相應(yīng)的客戶端。

c.JPG
另外還可以通過QWSServer::KeyboardFilter類實(shí)現(xiàn)按鍵事件的全局的底層過濾器。這種方法可以實(shí)現(xiàn)電源管理中的一鍵掛起,而不用在所有的應(yīng)用程序中都對這個(gè)按鍵事件進(jìn)行過濾。
如圖4所示,服務(wù)器通過UNIX域套接字與客戶端進(jìn)行通信??蛻舳藦姆?wù)器接收事件,這些事件通過重新實(shí)現(xiàn)QApplication的qwsEvent-Filter()函數(shù)可以被直接檢索訪問。

d.JPG
客戶端相互之間(和服務(wù)器)通過QCopChannel類通信。QCOP用于在多個(gè)通道間傳送信息,是一個(gè)多對多的通信協(xié)議。每個(gè)通道用名字作為識(shí)別 ID,任何一個(gè)想要和它通信的通道都能監(jiān)聽它。QCOP協(xié)議既允許在相同的地址空間內(nèi)的客戶端之間進(jìn)行通信,也允許在不同的進(jìn)程的客戶端之間進(jìn)行通信。
3.3 字符輸入層
如圖5所示,當(dāng)一個(gè)服務(wù)器應(yīng)用程序開始運(yùn)行時(shí)使用Qt的插件系統(tǒng)加載驅(qū)動(dòng),驅(qū)動(dòng)是一個(gè)QWSKeyboardHandler類的實(shí)例。

e.JPG
鍵盤驅(qū)動(dòng)從設(shè)備接收鍵盤事件,并把事件封裝成一個(gè)QWSEvent類的實(shí)例,然后把這個(gè)類傳送給服務(wù)器。定制鍵盤可以通過子類QWSKeybo- ardHandler類創(chuàng)建一個(gè)鍵盤驅(qū)動(dòng)插件來實(shí)現(xiàn)。默認(rèn)的QKbdDriverFactory類將自動(dòng)檢測到這個(gè)插件然后把驅(qū)動(dòng)加載到正在運(yùn)行的服務(wù)器應(yīng)用中。

4 鍵盤驅(qū)動(dòng)插件的實(shí)現(xiàn)
本文通過Qt的插件系統(tǒng)實(shí)現(xiàn)了矩陣鍵盤的驅(qū)動(dòng)。插件是一種遵循一定規(guī)范的應(yīng)用程序編寫出來的程序。在現(xiàn)代計(jì)算機(jī)語言中,應(yīng)用環(huán)境復(fù)雜多變,常常要面臨著適應(yīng)這樣那樣的未知需求的挑戰(zhàn),為了使程序設(shè)計(jì)語言具有良好的可擴(kuò)展性,使之能夠適應(yīng)復(fù)雜的應(yīng)用環(huán)境,同時(shí)也出于降低設(shè)計(jì)復(fù)雜性的考慮,采用插件機(jī)制是一個(gè)很不錯(cuò)的方法。通過采用插件系統(tǒng),把擴(kuò)展功能從框架中剝離出來,可以降低框架的復(fù)雜度,讓框架更容易實(shí)現(xiàn)。擴(kuò)展功能與框架之間以一種松耦合的方式集成,允許在保持不變的情況下,實(shí)現(xiàn)彼此的獨(dú)立變化。
Qt提供了兩種插件:一種是高層的插件,用來擴(kuò)展Qt自身,如自定義數(shù)據(jù)庫驅(qū)動(dòng)、圖像格式、文本編解碼器、自定義風(fēng)格等;一種是底層的插件,用來擴(kuò)展Qt應(yīng)用程序。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


關(guān)鍵詞: 鍵盤 接口 嵌入式

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉