浅析 Qt Embedded 键盘驱动分析 (下)
创始人
2024-08-02 02:20:16
0

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

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...