现在的位置: 首页 > 综合 > 正文

矩阵键盘模拟标准按键,实现QTE标准按键操作

2013年12月07日 ⁄ 综合 ⁄ 共 2181字 ⁄ 字号 评论关闭

    起初由于时间关系,测试 
    export QWS_KEYBOARD=Linuxinput:/dev/input/event1
   
    出现console控制台被屏蔽,没有任何串口信息,个人感觉数据可能输入到屏幕framebuffer中,导致触摸屏操作很卡。然后选择
 
    export QWS_KEYBOARD=TTY:/dev/input/event1
   
    接收到大量的错误数据,查看QT库,QT默认选择的是tty接收键盘信息,但是设备文件不是库函数中/dev/tty0,造成读取错误。通过linux下标准input,接收响应事件
struct input_event,读取键值,通过槽函数建立监听实现按键功能。

   
    后来项目测试阶段,通过监听响应槽函数(执行操作很多),造成按键响应比较慢,不满足用户需求。
阅读库函数代码,发现LinuxInput不处理VT(参见linux/vt.h),这就是为什么串口控制台没有数据显示,造成数据阻塞的原因,因而参考LinuxInput方式修改kbdtty_qws,实现了标准的按键控制。
 

            修改程序中关于按键响应的部分,发现子窗口弹出后无法响应按键消息,通过打印信息,发现keyPressEvent函数没有执行,但是执行了标准的按键响应,证明按键事件被继承的父类grab,因为不能响应继承子类改写的按键事件,目前采用this->grabKeyboard();获得按键消息,然后在Ui销毁后释放this->releaseKeyboard();不知道是否还有别的方式,先写到这了。
 

/src/gui/embedded/qkbdtty_qws.cpp
 
 #if defined Q_OS_LINUX
 #  include <linux/kd.h>
+#  include <linux/input.h>
 #  include <linux/vt.h> //TODO: move vt handling somewhere else (QLinuxFbScreen?)
 
 #  include "qscreen_qws.h"

-bool QWSTtyKeyboardHandler::filterKeycode(char &)
+
+bool QWSTtyKeyboardHandler::filterInputEvent(quint16 &, qint32 &)
 {
     return false;
 }
 
 void QWSTtyKbPrivate::readKeycode()
 {
-    char buffer[32];
+    struct ::input_event buffer[32];
     int n = 0;
 
     forever {
-        n = QT_READ(m_tty_fd, buffer + n, 32 - n);
+        n = QT_READ(m_tty_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);
 
         if (n == 0) {
             qWarning("Got EOF from the input device.");

         } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {
             qWarning("Could not read from input device: %s", strerror(errno));
             return;
-        } else {
+        } else if (n % sizeof(buffer[0]) == 0) {
             break;
         }
     }
 
+    n /= sizeof(buffer[0]);
+
     for (int i = 0; i < n; ++i) {
-        if (m_handler->filterKeycode(buffer[i]))
+        if (buffer[i].type != EV_KEY)
+            continue;
+
+        quint16 code = buffer[i].code;
+        qint32 value = buffer[i].value;
+
+        if (m_handler->filterInputEvent(code, value))
             continue;
 
         QWSKeyboardHandler::KeycodeAction ka;
-        ka = m_handler->processKeycode(buffer[i] & 0x7f, (buffer[i] & 0x80) == 0x00, buffer[i] == m_last_keycode);
-        m_last_keycode = buffer[i];
+        ka = m_handler->processKeycode(code, value != 0, value == 2);
 
         switch (ka) {
         case QWSKeyboardHandler::CapsLockOn:
####################################################################################
/src/gui/embedded/qkbdtty_qws.h

     explicit QWSTtyKeyboardHandler(const QString&);
     virtual ~QWSTtyKeyboardHandler();
 
-    virtual bool filterKeycode(char &code);
+    virtual bool filterInputEvent(quint16 &, qint32 &);
 
 private:
     QWSTtyKbPrivate *d;

抱歉!评论已关闭.