最近在做一个数控机床CNC的嵌入式QT项目,当用户按设备上的小键盘区1 - 9的按键时,需要映射到其它的键值,而不是Qt::Key_1 - Qt::Key_9。
尝试过单独起一个线程,从linux直接读取键值,用open("/dev/input/event3", O_RDWR)这种方法;也尝试过直接调QKeyEvent的nativeScanCode()方法获取硬件按键的键值。但这两种方法都有同一个问题,就是如果我有文本编辑器控件,这时用户按了小键盘的1,虽然我可以捕获这个scan code硬件按键的键值去处理自己的逻辑,但我却无法阻止文本编辑器上输入了个1,当然,我更不想自己去自定义一个文本编辑器。
最后,我想到了改QT源码中键值映射这部分的代码,然后重新编译QT库放到板卡上。
下面来看QT这部分的源码:
首先看qkbdlinuxinput_qws.cpp
QWSLinuxInputKbPrivate::QWSLinuxInputKbPrivate(QWSLinuxInputKeyboardHandler *h, const QString &device)
: m_handler(h), m_fd(-1), m_tty_fd(-1), m_orig_kbmode(K_XLATE)
{
.
.
.
QString dev = QLatin1String("/dev/input/event1");
.
.