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

来源: http://blog.csdn.net/haojunvs110/article/details/7939368

起初由于时间关系,测试 
    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();不知道是否还有别的方式,先写到这了。
 

  1. <SPAN style="FONT-SIZE: 18px">/src/gui/embedded/qkbdtty_qws.cpp  
  2.    
  3.  #if defined Q_OS_LINUX   
  4.  #  include <linux/kd.h>   
  5. +#  include <linux/input.h>  
  6.  #  include <linux/vt.h> //TODO: move vt handling somewhere else (QLinuxFbScreen?)   
  7.    
  8.  #  include "qscreen_qws.h"   
  9.   
  10. -bool QWSTtyKeyboardHandler::filterKeycode(char &)  
  11. +  
  12. +bool QWSTtyKeyboardHandler::filterInputEvent(quint16 &, qint32 &)  
  13.  {  
  14.      return false;  
  15.  }  
  16.    
  17.  void QWSTtyKbPrivate::readKeycode()  
  18.  {  
  19. -    char buffer[32];  
  20. +    struct ::input_event buffer[32];  
  21.      int n = 0;  
  22.    
  23.      forever {  
  24. -        n = QT_READ(m_tty_fd, buffer + n, 32 - n);  
  25. +        n = QT_READ(m_tty_fd, reinterpret_cast<char *>(buffer) + n, sizeof(buffer) - n);  
  26.    
  27.          if (n == 0) {  
  28.              qWarning("Got EOF from the input device.");  
  29.   
  30.          } else if (n < 0 && (errno != EINTR && errno != EAGAIN)) {  
  31.              qWarning("Could not read from input device: %s", strerror(errno));  
  32.              return;  
  33. -        } else {  
  34. +        } else if (n % sizeof(buffer[0]) == 0) {  
  35.              break;  
  36.          }  
  37.      }  
  38.    
  39. +    n /= sizeof(buffer[0]);  
  40. +  
  41.      for (int i = 0; i < n; ++i) {  
  42. -        if (m_handler->filterKeycode(buffer[i]))  
  43. +        if (buffer[i].type != EV_KEY)  
  44. +            continue;  
  45. +  
  46. +        quint16 code = buffer[i].code;  
  47. +        qint32 value = buffer[i].value;  
  48. +  
  49. +        if (m_handler->filterInputEvent(code, value))  
  50.              continue;  
  51.    
  52.          QWSKeyboardHandler::KeycodeAction ka;  
  53. -        ka = m_handler->processKeycode(buffer[i] & 0x7f, (buffer[i] & 0x80) == 0x00, buffer[i] == m_last_keycode);  
  54. -        m_last_keycode = buffer[i];  
  55. +        ka = m_handler->processKeycode(code, value != 0, value == 2);  
  56.    
  57.          switch (ka) {  
  58.          case QWSKeyboardHandler::CapsLockOn:  
  59. ####################################################################################   
  60. /src/gui/embedded/qkbdtty_qws.h  
  61.   
  62.      explicit QWSTtyKeyboardHandler(const QString&);  
  63.      virtual ~QWSTtyKeyboardHandler();  
  64.    
  65. -    virtual bool filterKeycode(char &code);  
  66. +    virtual bool filterInputEvent(quint16 &, qint32 &);  
  67.    
  68.  private:  
  69.      QWSTtyKbPrivate *d;</SPAN> 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值