嵌入式Linux中基于Qt/Embedded的鍵盤(pán)接口設(shè)計(jì)
一個(gè)鍵盤(pán)插件的實(shí)現(xiàn),通常至少需要兩個(gè)類(lèi):一個(gè)是插件封裝器類(lèi),它實(shí)現(xiàn)了插件的通用API函數(shù);另外一個(gè)是一個(gè)或多個(gè)處理器類(lèi),每個(gè)處理器類(lèi)都實(shí)現(xiàn)了一種用于特殊類(lèi)型插件的API。通過(guò)封裝器類(lèi)才能訪問(wèn)這些處理器類(lèi)。下面是具體的實(shí)現(xiàn)過(guò)程:
首先要實(shí)現(xiàn)一個(gè)自己的MyKeyDriverPlugin類(lèi),這個(gè)類(lèi)繼承了QKbdDriverPlugin類(lèi),需要重新實(shí)現(xiàn)QKbdDriverPlugin::keys()函數(shù)和QKbdDriverPlugin::create()函數(shù)。
keys()函數(shù)返回一個(gè)鍵盤(pán)插件的鍵值,這個(gè)鍵值不能和其他的鍵值相沖突。create()函數(shù)返回一個(gè)給定鍵值的QWSKeyboardHandler派生類(lèi)的實(shí)例。
在.cpp文件的最后,必須添加一個(gè)下面這樣的宏:Q_EXPORT_PLUGIN2(keyboard,MyKeyDriverPlugin)
第一個(gè)參數(shù)項(xiàng)是目標(biāo)庫(kù)名字去除任意擴(kuò)展符、前綴或者版本號(hào)之后的基本名。第二個(gè)參數(shù)則是插件的類(lèi)名。
第二個(gè)要實(shí)現(xiàn)的類(lèi)是處理類(lèi)MyKeyboardHandler,這個(gè)類(lèi)需要繼承QWSKeyboardHandler類(lèi)。當(dāng)鍵盤(pán)驅(qū)動(dòng)捕獲到鍵盤(pán)數(shù)據(jù)時(shí),系統(tǒng)會(huì)通過(guò)套接字監(jiān)聽(tīng)鍵盤(pán)信息,并在MykeyboardHandler::readKbdData()中對(duì)捕捉到的掃描數(shù)據(jù)進(jìn)行處理并封裝,然后向服務(wù)器端發(fā)送鍵盤(pán)事件。
①打開(kāi)鍵盤(pán)設(shè)備并初始化,一般調(diào)用open()函數(shù)。
②監(jiān)控鍵盤(pán)設(shè)備,調(diào)用QScoketNotifier監(jiān)控鍵盤(pán)設(shè)備kbdFd。
③發(fā)生鍵盤(pán)事件時(shí)讀取鍵盤(pán)事件,讀取鍵盤(pán)事件后將鍵值、按下等信息翻譯成Qt內(nèi)部鍵盤(pán)事件的格式,并通過(guò)調(diào)用processKeyEvent將事件分發(fā)出去。
5 鍵盤(pán)插件在應(yīng)用程序中的使用
將鍵盤(pán)插件編譯后生成一個(gè)libkeyboard.so的動(dòng)態(tài)庫(kù),這個(gè)動(dòng)態(tài)庫(kù)的名字是由Q_EXPORT_PLUGIN2宏的第一個(gè)參數(shù)決定的。派生插件默認(rèn)存儲(chǔ)在標(biāo)準(zhǔn)插件目錄下的子目錄中,如果它們沒(méi)有存儲(chǔ)在正確的目錄下Qt不會(huì)找到這些插件,所以要在使用的文件系統(tǒng)中創(chuàng)建Qt的標(biāo)準(zhǔn)插件目錄。
要想應(yīng)用程序在啟動(dòng)的時(shí)候能夠正確加載鍵盤(pán)插件還要設(shè)置嵌入式Linux系統(tǒng)中的環(huán)境變量:
QWS_KEYBOARD=MyKeyHandler:/dev/kbd
MyKeyHandler對(duì)應(yīng)著key()函數(shù)中的鍵值,kbd是在/dev文件夾下的鍵盤(pán)設(shè)備文件。Qt應(yīng)用程序開(kāi)始運(yùn)行后要根據(jù) QWS_KEYBOARD這個(gè)環(huán)境變量創(chuàng)建一個(gè)MyKeyboardHandler類(lèi)。窗口部件響應(yīng)服務(wù)器分發(fā)的鍵盤(pán)事件還要重新實(shí)現(xiàn)如下函數(shù)。
}
本文引用地址:http://butianyuan.cn/article/151098.htm linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論