Qt Embedded 键盘驱动分析(下)

不羁岁月 提交于 2019-12-01 23:33:31
键盘驱动插件究竟是怎么工作的呢?怎么才能让它来响应板子上的按键消息呢?这些疑问需要分析一个完整的键盘处理插件才能回答,下面我们就来看看最基本的pc101这个键盘插件是怎么实现的吧。首先,说到插件, 先要实现一个插件的框架,这个框架的代码要遵循Qt中的插件规范,还要符合键盘驱动插件的特点。 听起来很难?呵呵,其实非常简单, 只有两个函数需要自己实现。

涉及的代码:
键盘plugin框架:src/plugins/kbddrivers/usb/main.cpp
键盘driver handler的实现:src/gui/embedded/qkbdusb_qws.cpp

实现插件框架  main.cpp
class QUsbKbdDriver : public QKbdDriverPlugin  
{
public:  
    QUsbKbdDriver();  
    QStringList keys() const;  
    QWSKeyboardHandler* create(const QString &driver, const QString &device);  
};
 keys就是返回当前driver插件的键值,只要不和其他插件键值冲突就行。create返回你实现的QWSKeyboardHandler派生类的实例。

实现键盘处理实例  qkbdusb_qws.h  
class QWSUsbKeyboardHandler : public QWSPC101KeyboardHandler  
{  
public:  
    QWSUsbKeyboardHandler(const QString&);  
    virtual ~QWSUsbKeyboardHandler();  
private:  
    QWSUsbKbPrivate *d;  
};
从代码上来看, 这个Handler的类除了必须从QWSKeyboardHandler基类来派生之外,没有什么特别的要求。 但它对应的cpp文件其实实现了不少的功能,篇幅关系不能把整个代码贴出来,特此总结一个一般的keyboard driver plugin流程,如下:

1、打开键盘设备并初始化 — 一般情况下是调用open,由设备驱动决定
2、监控键盘事件 — 一般用QSocketNotifier去监控键盘fd
3、发生键盘事件时读取键盘事件信息,如按下、抬起等 — 一般是调用read,或者ioctl,取决于键盘驱动
4、获得键盘事件信息后,将键值、按下等信息翻译成Qt内部键盘事件的格式,并通过调用processKeyEvent将事件分发出去。
5、析构函数别忘了关闭设备

90%以上的Keyboard Driver Handler会遵循这样的流程去处理键盘,如果我们要写自己的插件,肯定这样写也没错。具体的代码可能还需要看看例子。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!