自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析 Qt Embedded 鍵盤驅(qū)動(dòng)分析 (下)

移動(dòng)開發(fā)
我們都知道Qt-x11借助XServer提供對(duì)硬件外設(shè)的接口,不需要直接和driver打交道,Qt Embedded則顛覆了這個(gè)傳統(tǒng)并且摒棄了對(duì)XServer的依賴, 所以免不了要有和硬件driver交互的時(shí)候。

Qt Embedded 鍵盤驅(qū)動(dòng)分析是我們所要介紹的內(nèi)容。我們接著上文繼續(xù)介紹, 淺析 Qt Embedded 鍵盤驅(qū)動(dòng)分析 (上)  上文我們介紹了下面這兩個(gè)代碼文件中載入鍵盤驅(qū)動(dòng)插件的流程。

讀取環(huán)境變量,載入相應(yīng)的鍵盤驅(qū)動(dòng)插件:src/gui/embedded/qwindowsystem_qws.cpp

創(chuàng)建鍵盤處理函數(shù)類的實(shí)例:src/gui/embedded/qkbddriverfactory_qws.cpp

但光說(shuō)流程沒有辦法解釋大多數(shù)人內(nèi)心的疑問(wèn), 鍵盤驅(qū)動(dòng)插件究竟是怎么工作的呢? 怎么才能讓它來(lái)響應(yīng)板子上的按鍵消息呢?這些疑問(wèn)需要分析一個(gè)完整的鍵盤處理插件才能回答, 下面我們就來(lái)看看最基本的pc101這個(gè)鍵盤插件是怎么實(shí)現(xiàn)的吧。首先,說(shuō)到插件, 先要實(shí)現(xiàn)一個(gè)插件的框架, 這個(gè)框架的代碼要遵循Qt中的插件規(guī)范,還要符合鍵盤驅(qū)動(dòng)插件的特點(diǎn)。 聽起來(lái)很難? 呵呵,其實(shí)非常簡(jiǎn)單, 只有兩個(gè)函數(shù)需要自己實(shí)現(xiàn)。

涉及的代碼:

鍵盤plugin框架:src/plugins/kbddrivers/usb/main.cpp

鍵盤driver handler的實(shí)現(xiàn):src/gui/embedded/qkbdusb_qws.cpp

實(shí)現(xiàn)插件框架

main.cpp

  1. class QUsbKbdDriver : public QKbdDriverPlugin  
  2. {public:  
  3. QUsbKbdDriver();  
  4. QStringList keys() const;  
  5.  QWSKeyboardHandler* create(const QString &driver, const QString &device);  
  6. }; 

需要實(shí)現(xiàn)的函數(shù)已經(jīng)用藍(lán)色字體標(biāo)示出來(lái)了。 通過(guò)閱讀main.cpp的代碼我們發(fā)現(xiàn),這兩個(gè)函數(shù)實(shí)在是太簡(jiǎn)單了, 簡(jiǎn)直不值一提, 都是最“標(biāo)準(zhǔn)”的實(shí)現(xiàn)方式,完全不用動(dòng)腦子。 keys就是返回當(dāng)前driver插件的鍵值, 只要不和其他插件鍵值沖突就行。 create返回你實(shí)現(xiàn)的QWSKeyboardHandler派生類的實(shí)例。

實(shí)現(xiàn)鍵盤處理實(shí)例

  1. qkbdusb_qws.h  
  2. class QWSUsbKeyboardHandler : public QWSPC101KeyboardHandler  
  3. {  
  4. public:  
  5. QWSUsbKeyboardHandler(const QString&);  
  6. virtual ~QWSUsbKeyboardHandler();  
  7. private:  
  8. QWSUsbKbPrivate *d;  
  9. }; 

從代碼上來(lái)看, 這個(gè)Handler的類除了必須從QWSKeyboardHandler基類來(lái)派生之外,沒有什么特別的要求。 但它對(duì)應(yīng)的cpp文件其實(shí)實(shí)現(xiàn)了不少的功能, 篇幅關(guān)系不能把整個(gè)代碼貼出來(lái),特此總結(jié)一個(gè)一般的keyboard driver plugin流程,如下:

1、打開鍵盤設(shè)備并初始化 — 一般情況下是調(diào)用open

2、監(jiān)控鍵盤事件 — 一般用QSocketNotifier去監(jiān)控鍵盤fd

3、發(fā)生鍵盤事件時(shí)讀取鍵盤事件信息, 如按下、抬起等 — 一般是調(diào)用read

4、獲得鍵盤事件信息后, 將鍵值、按下等信息翻譯成Qt內(nèi)部鍵盤事件的格式,并通過(guò)調(diào)用processKeyEvent將事件分發(fā)出去。

5、析構(gòu)函數(shù)別忘了關(guān)閉設(shè)備

90%以上的Keyboard Driver Handler會(huì)遵循這樣的流程去處理鍵盤, 如果我們要寫自己的插件,肯定這樣寫也沒錯(cuò)。具體的代碼可能還需要看看例子,請(qǐng)大家閱讀qkbdusb_qws.cpp然后回答下面幾個(gè)問(wèn)題,以驗(yàn)證自己對(duì)這部分是否弄清楚了:

打開設(shè)備是不是一定要調(diào)用open函數(shù)? 這是由什么決定的?

A: 不一定, 但多數(shù)字符設(shè)備驅(qū)動(dòng)會(huì)提供open方法打開設(shè)備。 當(dāng)然是由設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn)來(lái)決定的。

怎樣用QSocketNotifier去監(jiān)控fd?

A: 文檔里找答案, 代碼里找例子。 關(guān)于SocketNotifier我有一點(diǎn)補(bǔ)充: 有人問(wèn)它的SN在鍵盤按下時(shí)不會(huì)發(fā)出activated信號(hào), 可能是什么原因? 這個(gè)問(wèn)題我所知道的有兩種可能性, 一是設(shè)備名字搞錯(cuò)了, 打開的不是鍵盤設(shè)備; 二是設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)的有些問(wèn)題導(dǎo)致SN不能正常工作, 記得以前在哪里看到過(guò)SN依賴底層提供的poll函數(shù)工作, 如果設(shè)備驅(qū)動(dòng)沒有實(shí)現(xiàn)該函數(shù)或者實(shí)現(xiàn)的不對(duì)就會(huì)造成SN工作不正常了, 出現(xiàn)問(wèn)題的話嘗試從這個(gè)角度去debug看看。

讀取鍵盤事件一定用read函數(shù)嗎? 還有沒有其他可能?
A: 不一定, 見過(guò)用ioctl的, 好像還比較常見。 取決于鍵盤驅(qū)動(dòng)的實(shí)現(xiàn)。

該如何定義讀取鍵盤事件使用的數(shù)據(jù)結(jié)構(gòu)呢?
A: of course要看鍵盤的驅(qū)動(dòng)。

這些問(wèn)題都是文章中沒有講到的問(wèn)題,但相信通過(guò)大家的聰明才智一定可以解答。

小結(jié):淺析 Qt Embedded 鍵盤驅(qū)動(dòng)分析 (下)的內(nèi)容介紹完了,希望本文能幫你解決問(wèn)題。

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-29 15:14:22

Qt Embedded 鍵盤

2011-06-13 13:35:06

Qt Embedded QT

2010-01-13 14:18:52

Windows Emb

2011-06-20 14:27:57

Qt Embedded

2011-06-30 10:59:43

2011-06-10 13:21:00

Qt 網(wǎng)絡(luò)

2011-07-05 13:32:45

QT Mysql 驅(qū)動(dòng)

2011-06-09 18:05:00

QT MySql

2011-06-13 11:07:22

QT 移植

2009-07-17 13:49:57

Windows Emb

2011-06-30 13:49:00

Qt 鍵盤 聚焦

2011-06-20 15:13:08

Qt 對(duì)象模型

2011-06-21 13:52:18

Qt 界面

2011-06-10 11:24:08

Qt Quick Designer

2011-06-28 13:47:37

Embedded QT ARM

2011-06-29 09:20:41

Qt Embedded Qtopia

2009-06-19 17:14:47

JDBC驅(qū)動(dòng)設(shè)置

2009-06-19 15:08:23

JDBC驅(qū)動(dòng)

2011-06-15 18:00:26

2021-09-08 09:22:23

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)