涉及的代码:
键盘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会遵循这样的流程去处理键盘,如果我们要写自己的插件,肯定这样写也没错。具体的代码可能还需要看看例子。