经过查看源代码发现Qt的键盘处理是判断环境变量QWS_KEYBOARD再加载相应的键盘处理拦截类,  而qt已经包含了几个典型的键盘处理,只要以它们为蓝本即可编写自己的处理类! 一下我以 vr4xx为模板, 建立QWSMx21ButtonsHandler键盘处理类! 以下是相关实现代码,

2. 添加键盘处理类
class QWSMx21ButtonsHandler : public QWSKeyboardHandler
{
    Q_OBJECT
public:
    QWSMx21ButtonsHandler();
    virtual QWSMx21ButtonsHandler();

bool isOpen() { return buttonFD > 0; }

private slots:
    void readKeyboardData();  // 这个函数最重要, 包含的读键盘扫描码的处理

private:
    QString terminalName;
    int buttonFD;
    int kbdIdx;
    int kbdBufferLen;
    unsigned char *kbdBuffer;
    QSocketNotifier *notifier;
};
/*
 * mx21 buttons driver
 */

QWSMx21ButtonsHandler::QWSMx21ButtonsHandler() : QWSKeyboardHandler()
{
    terminalName = "/dev/buttons";
    buttonFD = -1;
    notifier = 0;

if ((buttonFD = open(terminalName, O_RDWR | O_NDELAY, 0)) < 0)
    {
    qWarning("Cannot open %s/n", terminalName.latin1());
    }

if ( buttonFD >= 0 ) {
    notifier = new QSocketNotifier( buttonFD, QSocketNotifier::Read, this );
    connect( notifier, SIGNAL(activated(int)),this,
         SLOT(readKeyboardData()) );
    }

kbdBufferLen = 80;
    kbdBuffer = new unsigned char [kbdBufferLen];
    kbdIdx = 0;
}

QWSMx21ButtonsHandler::~QWSMx21ButtonsHandler()
{
    if ( buttonFD > 0 ) {
    ::close( buttonFD );
    buttonFD = -1;
    }
    delete notifier;
    notifier = 0;
    delete [] kbdBuffer;
}

void QWSMx21ButtonsHandler::readKeyboardData()
{

int n = 0;
    do {
    n  = read(buttonFD, kbdBuffer+kbdIdx, kbdBufferLen - kbdIdx );
    if ( n > 0 )
        kbdIdx += n;
    } while ( n > 0 );

int idx = 0;
    while ( kbdIdx - idx >= 2 ) {
        unsigned char *next = kbdBuffer + idx;
        unsigned short *code = (unsigned short *)next;

if ( ( *code & 0x8000) != 0x8000) {
            idx += 2;
            continue;
        }
        int keycode = Qt::Key_unknown;
       //在此添加键盘扫描码映射关系
        switch ( (*code) & 0x00ff ) {
            case 59:
            keycode = Qt::Key_Up;
            break;          
            default:
            qDebug("Unrecognised key sequence %d", (int)code );
        }
            processKeyEvent( 0, keycode, 0, TRUE, FALSE );
        idx += 2;
    }

int surplus = kbdIdx - idx;
    for ( int i = 0; i < surplus; i++ )
    kbdBuffer[i] = kbdBuffer[idx+i];
    kbdIdx = surplus;
}

2. 添加加载代码
src/kernel/qkeyboard_qws.cpp
/*
 * keyboard driver instantiation
 */

QWSKeyboardHandler *QWSServer::newKeyboardHandler( const QString &spec )
{
    QWSKeyboardHandler *handler = 0;

QString device;
    QString type;
    int colon=spec.find(':');
    if ( colon>=0 ) {
    type = spec.left(colon);
    device = spec.mid(colon+1);
    } else {
    type = spec;
    }

if ( type == "Buttons" ) {
#if defined(QT_QWS_YOPY)
    handler = new QWSyopyButtonsHandler();
#elif defined(QT_QWS_CASSIOPEIA)
    handler = new QWSVr41xxButtonsHandler();
#endif
    } else if ( type == "QVFbKeyboard" ) {
    handler = new QWSVFbKeyboardHandler();
    } else if ( type == "USB" ) {
    handler = new QWSUsbKeyboardHandler(device);
    } else if ( type == "TTY" ) {
    handler = new QWSTtyKeyboardHandler(device);
    } else if ( type == "MX21" ) {   //这是我们添加的MX21键盘处理类
    handler = new QWSMx21ButtonsHandler();
    } else {
    qWarning( "Keyboard type %s:%s unsupported", spec.latin1(), device.latin1() );
    }

return handler;
}
3.重新编译链接
在目标平台上只要设置QWS_KEYBOARD=MX21即可在界面中拦截到键盘事件处理! 
这里只是给出了基本原理实现,具体的键盘扫瞄码映射关系得看具体的操作!
最新的qtopia-core 版本也可以参考Vr4xx 实现来做, 在src/gui/embedded/下!

希望对有需要的人有所帮助!

在Qt/Embedded 2.3.8中添加MX21Ads键盘处理相关推荐

  1. Windows 8.1中添加美式键盘

    说明:这里将添加"简体中文(美式键盘)",也就是英文输入法,并设置为默认输入法 1.打开控制面板-时钟.语言和区域-语言,点击"添加语言",选择"英语 ...

  2. QT中添加图片资源的方法

    1.在ui设计界面中添加label,用于显示图片 2.添加QT资源文件 往项目中添加新文件,选择QT分类中的资源文件,名称为"myImage",其他选项默认. 3.添加资源 在项目 ...

  3. Qt Creator和VS2010中添加槽信号_差异与详解

    1.前言: Qt  的窗口部件通过发射信号(signal)来表明一个用户的动作已经发生了或者是一个状态已经改变了.如点击一个QPushButton时,按钮会发送一个clicked()信号,信号可以与函 ...

  4. 【转】QT中添加的资源文件qrc时的路径问题小结

    @2019-06-13 [小记] QT中添加的资源文件qrc时的路径问题小结 转载于:https://www.cnblogs.com/skullboyer/p/11014943.html

  5. 在Qt Creator中添加OpenCV库

    在项目的pro文件中添加如下代码: INCLUDEPATH += D:/opencv/build/include win32:CONFIG(debug, debug|release): { LIBS ...

  6. Qt解决资源文件中添加图片,对应控件不显示图片的问题

    //资源文件--为控件添加图标//:/new/prefix1/image/mr.jpgQPixmap pic; //定义一个图片对象pic.load(":/new/prefix1/a.jpg ...

  7. 在Qt项目中添加pri文件

    在Qt项目框架里,很多人都喜欢用pri文件来管理项目.那么今天就来讲讲这个pri文件. 目录 前言 创建pri文件的步骤 一.创建Qt项目 二.创建pri空文件 三.调试 前言 一般我们创建Qt项目工 ...

  8. Qt中添加背景图片的方法

    Qt中添加背景图片的方法 QPalette的方法 #include #include int main(int argc, char *argv[]) { QApplication app(argc, ...

  9. 在Qt中添加菜单图标

    第一步:新建Qt Widgets Application,取合适的项目名称,基类选择QMainWindow,类名为MainWindow. 第二步:创建完项目后,双击mainwindow.ui文件进入设 ...

  10. qt 二次开发 研华daq_在QT项目中添加对研华数采模块的支持

    一.正确安装研华数采模块管理程序Advantech Device Manager,并安装相应模块驱动. 二.将C:\Program Files\Advantech\Adsapi路径(默认安装位置)下的 ...

最新文章

  1. AI+大数据助力抗疫,带你认识百度地图的新玩法!
  2. Jmeter响应内容显示乱码问题的解决办法
  3. WebKit 内核源码分析 (五)
  4. 语言nomogram校准曲线图_R语言实现Cox模型校准度曲线绘制
  5. mysql表空间转移_mysql共享表空间扩容,收缩,迁移
  6. 华为9x升级鸿蒙,荣耀9X升级鸿蒙2.0系统截图曝光:4G内存流畅度照样起飞!
  7. Kafka和Unix管道的示例
  8. iOS 实现搜索关键字高亮
  9. Android开发之数据库Sqlite
  10. vue利用Bscroll开发一个城市列表组件,带右侧字母导航栏
  11. DLL Care破解版|DLL Care(DLL修复工具)破解版下载(附激活码)
  12. Java实现阿里云域名动态解析,DDNS功能
  13. PhpStorm 2019 for mac(PHP集成开发工具) 2019.1.3中文激活版
  14. ideaij 按内容查找文件
  15. 计算机的发明还不到一百年 英语,考研英语作文万能句子25个.doc
  16. 计算机操作系统(第四版)第四章存储器管理—课后习题答案
  17. pve 缩小LXC 磁盘
  18. 网页病毒挂马原理解析
  19. H3 BPM 端到端流程解决方案 (附H3 BPM软件下载地址)
  20. 联想服务器测试项目,联想服务器集成测试系统iPTS今上线

热门文章

  1. 爬楼梯算法-java(递归与非递归)
  2. [2018.05.05 T2] 互质2
  3. [数据结构] 左偏树
  4. react-hooks学习笔记
  5. 按顺序发起多次请求的loading使用
  6. 关于winfrom中如何快速导出DataGridView数据到excel中的问题
  7. pl sql入门比较好的书_【赵强老师】什么是PL/SQL?
  8. sublime运行python_sublime交互执行python文件方法
  9. python按照日期筛选excel_用python判断Excel单元格格式为输出日期(日期字段位置不固定)的,按datetime格式输出日期(而非float)_python excle 日期列...
  10. java实参传空_java形参、实参、值传递、引用传递