作者:刘洪涛,华清远见嵌入式学院讲师。

在嵌入式平台上运行QTE时,使用的键盘通常不是标准键盘,而是嵌入式设备外扩的普通按键。那么实现QTE键盘输入的方法大体上可以分为两类:

(1)编写一个普通按键驱动,然后开辟一个QT线程读取按键值,在通过信号把按键值发送出去。需要接收键盘输入的目标,声明槽函数,接收键盘信号。
(2)将按键驱动编写成标准键盘驱动,让QTE感觉和标准键盘在打交道。

上述两种方法给有特点。我在一些项目中多数都是使用第1种方式,感觉比较直观容易控制。但也有些情况要选用第2种方法。

第1种方法的实现比较容易,这里就不多说了。下面主要把第2种方法的实现过程描述一下。

具体实现标准键盘输入的过程可以分为两步:

(1) 找一个标准usb键盘,测试QTE能否正确设别标准键盘
        (2) 编写按键驱动,模拟标准键盘输入

一、第1步的实现过程:

●    配置QTE支持标准USB键盘
        配置qte库时,增加键盘支持的参数,如下:
        ./configure …… -qt-kbd-usb ……
        ●    配置内核支持USB键盘输入
        ●    插入USB键盘后,产生event设备节点,如/dev/event2
        ●    设置QTE关联的键盘设备的环境变量
                export QWS_KEYBOARD=USB:/dev/event2
        ●    编写一个接收键盘事件的QT测试代码。

class MyDialog : public QDialog
        {
                ……
        protected:
                virtual void keyPressEvent(QKeyEvent *k);
        };

void MyDialog::keyPressEvent(QKeyEvent *k)
        {
                qDebug("in press event %x",k->key());
        }

●    测试键盘输入

当按下F1~F12时,打印出:
        in press event 1000030
        in press event 1000031
        in press event 1000032
        in press event 1000033
        in press event 1000034
        in press event 1000035
        in press event 1000036
        in press event 1000037
        in press event 1000038
        in press event 1000039
        in press event 100003a

查QT帮助 Key_F1=0x1000030

说明QDialog 的keyPressEvent可以接收到它能获取的键盘信号,即QTE和USB键盘连接正确。

二、第2步的实现过程:

主要参考/driver/usb/input/usbkbd.c程序,完成键盘模拟。程序主要思想是编写一个支持EV_KEY的input设备驱动。下面摘取关键代码。

●    完成input设备的注册、注销

struct input_dev *input_dev;
        static unsigned char usb_kbd_keycode[256] = {
                0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
              50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
                4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
               27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
              65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
            105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
              72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
            191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
            115,114, 0, 0, 0,121, 0, 89, 93,124, 92, 94, 95, 0, 0, 0,
            122,123, 90, 91, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
              29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
            150,158,159,128,136,177,178,176,142,152,173,140
        };

/*初始化*/

static int button_init(void)
         {
         ……
                input_dev = input_allocate_device();//分配input设备
                input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
                // EV_KEY为要支持的键盘事件
                for (i = 0; i < 255; i++)
                         set_bit(usb_kbd_keycode[i], input_dev->keybit);
                 //设置支持的键盘码,可根据实际情况注册
                 input_register_device(input_dev);//注册input设备

}

/*注销*/

static void __exit button_cleanup(void)
        {
        ……
                input_unregister_device(input_dev);//注销input设备
        }

●    中断处理过程中完成键盘值的获取及input事件的递交

static irqreturn_t button_irq(int irq, void *dev_id, struct pt_regs *regs)
        {
        ……
                input_report_key(input_dev, 59, 1); //模拟键盘码F1按下过程
                input_report_key(input_dev, 59, 0);
                input_sync(input_dev);
        }
        /*在内核include/linux/input.h中
        #define KEY_F1 59
        */

上面给出了简要的过程,大家在具体实现过程中多参考/driver/usb/input/usbkbd.c文件,及注意按键去抖等问题。

嵌入式linux上QT标准键盘输入的实现相关推荐

  1. qt 调用linux键盘输入,嵌入式linux上QT标准键盘输入的实现

    1.嵌入式linux上QT标准键盘输入的实现 在嵌入式平台上运行QTE时,使用的键盘通常不是标准键盘,而是嵌入式设备外扩的普通按键.那么实现QTE键盘输入的方法大体上可以分为两类: (1)编写一个普通 ...

  2. QT接收Linux内核,嵌入式linux上QT标准键盘输入的实现

    在嵌入式平台上运行QTE时,使用的键盘通常不是标准键盘,而是嵌入式设备外扩的普通按键.那么实现QTE键盘输入的方法大体上可以分为两类: (1)编写一个普通按键驱动,然后开辟一个QT线程读取按键值,在通 ...

  3. qt linux软键盘拼音,嵌入式linux上Qt键盘输入实现拼音输入法

    作者:刘洪涛, 在嵌入式平台上运行QTE时,使用的键盘通常不是标准键盘,而是嵌入式设备外扩的普通按键.那么实现QTE键盘输入的方法大体上可以分为两类: (1)编写一个普通按键驱动,然后开辟一个QT线程 ...

  4. MiniGUI和其他嵌入式Linux 上的图形及图形用户界面系统

    基于linux和 minigui的嵌入式软件开发指南 第一节:MiniGUl-Threads 和 MiniGUl-Lite 的选择 第二节:理解消息循环和窗口过程 ----------- MiniGU ...

  5. 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南题八——MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统

    简介: 为了让读者对嵌入式 Linux 当中能够使用的图形及图形用户界面有个较为全面的认识,本文将为读者介绍一些嵌入式 Linux 系统中常见的图形及图形用户界面系统,并作为<基于 Linux ...

  6. 嵌入式 Linux 上的图形及图形用户界面系统

    1 Linux 图形领域的基础设施 本小节首先向读者描述 Linux 图形领域中常见的基础设施.之所以称为基础设施,是因为这些系统(或者函数库),一般作为其他高级图形或者图形应用程序的基本函数库.这些 ...

  7. MiniGUI 和其他嵌入式 Linux 上的图形及图形用户界面系统

    魏永明 (ymwei@minigui.org) 自由撰稿人 2001 年 11 月 为了让读者对嵌入式 Linux 当中能够使用的图形及图形用户界面有个较为全面的认识,本文将为读者介绍一些嵌入式 Li ...

  8. 嵌入式Linux的Qt

    嵌入式Linux的Qt 嵌入式Linux的Qt 配置特定设备 嵌入式Linux设备的平台插件 EGLFS LinuxFB 输入 使用libinput 鼠标Mouse 键盘 触碰 笔式平板电脑 调试输入 ...

  9. 在嵌入式linux上玩OpenGL

    前言 在我的嵌入式linux上板子资源和性能还是有限.想玩下OpenGL,倒不是板子flash或内存太小,而是底层图形接口是基于framebuffer的dev/fb0的,在标准的OpenGL下不支持. ...

最新文章

  1. 【动态规划】Part1
  2. 【免费软件测试视频-0013】——Loadrunner9.0 SLA Analysis
  3. 大主子表关联的性能优化方法
  4. elasticsearch 路由文档到分片
  5. 概率统计笔记:分布的核
  6. 芯片IC附近为啥要放0.1uF的电容?看完秒懂~
  7. PS2018学习笔记(30-35节)
  8. Apache服务器 403 Forbidden的几种错误原因小结!
  9. 在哪里学python-学Python从哪里开始?
  10. const 修饰的对象属性可以修改,但是修饰的常量就不可以修改
  11. Linux系统下微信网页版无法登录问题(deepin-wine-for-ubuntu)
  12. 英特尔核显自定义分辨率_让图像更精彩 英特尔核显如何设置
  13. token什么意思中文在C语言中,token是什么意思(token的含义及使用方法)
  14. 插上U盘提示“需要格式化”如何修复?u盘提示需要格式化,U盘打不开,且8G的U盘只报64M,为什么?
  15. matlab程序求解工程,面向计算科学与工程的Matlab编程源码
  16. 蓝桥ROS机器人之现代C++学习笔记7.4 条件变量
  17. 唧唧DOWN闪退的原因
  18. oracle OCP指南
  19. aria2搭建(CentOS 7)
  20. 动物系列3D虚拟解剖软件助力畜牧兽医专业学习

热门文章

  1. 服务器后台训练模型,查看后台进程,关闭后台进程
  2. MindManager安装常见问题解决
  3. 深度学习工具的「计算显微镜」预测蛋白质相互作用,以及新抗生素的潜在途径...
  4. onchange事件和input事件
  5. linux 查看mysql表结构_新手进阶 查看MySQL表结构命令
  6. 使用OpenCV制作一个动图表情包
  7. ORA-30926 无法在源表中获得一组稳定的行 Merge into 实战
  8. vue的 计算属性(computed)、methods、watched三者区别
  9. 深度学习Week6-运动鞋识别(Pytorch)
  10. sqlserver always on关于备份的总结