键盘驱动插件究竟是怎么工作的呢?怎么才能让它来响应板子上的按键消息呢?这些疑问需要分析一个完整的键盘处理插件才能回答,下面我们就来看看最基本的pc101这个键盘插件是怎么实现的吧。首先,说到插件, 先要实现一个插件的框架,这个框架的代码要遵循Qt中的插件规范,还要符合键盘驱动插件的特点。 听起来很难?呵呵,其实非常简单, 只有两个函数需要自己实现。
涉及的代码:
键盘plugin框架:src/plugins/kbddrivers/usb/main.cpp
键盘driver handler的实现:src/gui/embedded/qkbdusb_qws.cpp
实现插件框架 main.cpp
实现键盘处理实例 qkbdusb_qws.h
1、打开键盘设备并初始化 — 一般情况下是调用open,由设备驱动决定
2、监控键盘事件 — 一般用QSocketNotifier去监控键盘fd
3、发生键盘事件时读取键盘事件信息,如按下、抬起等 — 一般是调用read,或者ioctl,取决于键盘驱动
4、获得键盘事件信息后,将键值、按下等信息翻译成Qt内部键盘事件的格式,并通过调用processKeyEvent将事件分发出去。
5、析构函数别忘了关闭设备
90%以上的Keyboard Driver Handler会遵循这样的流程去处理键盘,如果我们要写自己的插件,肯定这样写也没错。具体的代码可能还需要看看例子。
涉及的代码:
键盘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会遵循这样的流程去处理键盘,如果我们要写自己的插件,肯定这样写也没错。具体的代码可能还需要看看例子。
来源:oschina
链接:https://my.oschina.net/u/195885/blog/123235