QT 按键1

浅析 Qt Embedded 键盘驱动分析 (下)

2011-06-29 15:36 佚名 互联网  我要评论(0) 字号: T |  T
一键收藏,随时查看,分享好友!

我们都知道Qt-x11借助XServer提供对硬件外设的接口,不需要直接和driver打交道,Qt Embedded则颠覆了这个传统并且摒弃了对XServer的依赖, 所以免不了要有和硬件driver交互的时候。

AD:

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 键盘驱动分析 (下)的内容介绍完了,希望本文能帮你解决问题。

你可能感兴趣的:(QT,qt,keyboard,框架,工作,数据结构,互联网)