成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析 Qt Embedded 鍵盤驅動分析 (下)

移動開發
我們都知道Qt-x11借助XServer提供對硬件外設的接口,不需要直接和driver打交道,Qt Embedded則顛覆了這個傳統并且摒棄了對XServer的依賴, 所以免不了要有和硬件driver交互的時候。

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

讀取環境變量,載入相應的鍵盤驅動插件:src/gui/embedded/qwindowsystem_qws.cpp

創建鍵盤處理函數類的實例:src/gui/embedded/qkbddriverfactory_qws.cpp

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

涉及的代碼:

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

鍵盤driver handler的實現:src/gui/embedded/qkbdusb_qws.cpp

實現插件框架

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. }; 

需要實現的函數已經用藍色字體標示出來了。 通過閱讀main.cpp的代碼我們發現,這兩個函數實在是太簡單了, 簡直不值一提, 都是最“標準”的實現方式,完全不用動腦子。 keys就是返回當前driver插件的鍵值, 只要不和其他插件鍵值沖突就行。 create返回你實現的QWSKeyboardHandler派生類的實例。

實現鍵盤處理實例

  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. }; 

從代碼上來看, 這個Handler的類除了必須從QWSKeyboardHandler基類來派生之外,沒有什么特別的要求。 但它對應的cpp文件其實實現了不少的功能, 篇幅關系不能把整個代碼貼出來,特此總結一個一般的keyboard driver plugin流程,如下:

1、打開鍵盤設備并初始化 — 一般情況下是調用open

2、監控鍵盤事件 — 一般用QSocketNotifier去監控鍵盤fd

3、發生鍵盤事件時讀取鍵盤事件信息, 如按下、抬起等 — 一般是調用read

4、獲得鍵盤事件信息后, 將鍵值、按下等信息翻譯成Qt內部鍵盤事件的格式,并通過調用processKeyEvent將事件分發出去。

5、析構函數別忘了關閉設備

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

打開設備是不是一定要調用open函數? 這是由什么決定的?

A: 不一定, 但多數字符設備驅動會提供open方法打開設備。 當然是由設備驅動的實現來決定的。

怎樣用QSocketNotifier去監控fd?

A: 文檔里找答案, 代碼里找例子。 關于SocketNotifier我有一點補充: 有人問它的SN在鍵盤按下時不會發出activated信號, 可能是什么原因? 這個問題我所知道的有兩種可能性, 一是設備名字搞錯了, 打開的不是鍵盤設備; 二是設備驅動實現的有些問題導致SN不能正常工作, 記得以前在哪里看到過SN依賴底層提供的poll函數工作, 如果設備驅動沒有實現該函數或者實現的不對就會造成SN工作不正常了, 出現問題的話嘗試從這個角度去debug看看。

讀取鍵盤事件一定用read函數嗎? 還有沒有其他可能?
A: 不一定, 見過用ioctl的, 好像還比較常見。 取決于鍵盤驅動的實現。

該如何定義讀取鍵盤事件使用的數據結構呢?
A: of course要看鍵盤的驅動。

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

小結:淺析 Qt Embedded 鍵盤驅動分析 (下)的內容介紹完了,希望本文能幫你解決問題。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-06-29 15:14:22

Qt Embedded 鍵盤

2010-01-13 14:18:52

Windows Emb

2011-06-13 13:35:06

Qt Embedded QT

2011-06-20 14:27:57

Qt Embedded

2011-06-10 13:21:00

Qt 網絡

2011-06-30 10:59:43

2011-06-20 15:13:08

Qt 對象模型

2011-06-21 13:52:18

Qt 界面

2011-06-10 11:24:08

Qt Quick Designer

2011-06-09 18:05:00

QT MySql

2011-06-13 11:07:22

QT 移植

2011-07-05 13:32:45

QT Mysql 驅動

2009-07-17 13:49:57

Windows Emb

2009-06-19 15:08:23

JDBC驅動

2009-06-19 17:14:47

JDBC驅動設置

2011-06-28 13:47:37

Embedded QT ARM

2011-06-30 13:49:00

Qt 鍵盤 聚焦

2011-06-15 18:00:26

2011-06-29 09:20:41

Qt Embedded Qtopia

2021-09-08 09:22:23

領域驅動設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区h | 一本岛道一二三不卡区 | 99视频入口 | 九九精品视频在线 | 欧美一区二区三区 | 国产东北一级毛片 | 中文字幕一区二区三区精彩视频 | 亚洲视频精品在线 | 国产成人亚洲精品 | av在线一区二区 | 国产视频第一页 | 国产精品免费av | 日韩中文字幕在线免费 | 欧美二级 | 超级黄色一级片 | 成人综合久久 | 免费看日韩视频 | 成人在线国产 | 欧美综合久久 | 欧美国产一区二区 | av在线免费观看网址 | 人妖av| 亚洲午夜精品一区二区三区他趣 | 狠狠干夜夜草 | 亚洲精品无| 国产精品av久久久久久久久久 | 91久久久久久久久久久 | 午夜成人在线视频 | 国产在线视频在线观看 | 中文字幕一区二区在线观看 | 激情欧美一区二区三区中文字幕 | 成人在线免费观看视频 | 暖暖成人免费视频 | 国产精品99久久久久久www | 日韩免费av | 亚洲三级在线 | 一区视频在线播放 | 午夜影院在线观看 | 日日夜夜天天干 | 91精品麻豆日日躁夜夜躁 | 国产欧美在线观看 |