当前位置: 首页 > news >正文

嵌入式linux上QT标准键盘输入的实现

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

在嵌入式平台上运行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文件,及注意按键去抖等问题。

相关文章:

  • 东北大学计算机应用基础试题,东北大学网络教育本科14秋学期《计算机应用基础》在线作业1试题答案...
  • 面试别人实际是在考验自己
  • 项目管理计算机考试试题,计算机软件项目管理考试试题及答案.doc
  • 培训!培训!包就业(下)——漂在中关村(6)
  • 计算机网络应用赛甘肃省,关于举办第三届“甘肃省大学生创新杯计算机运用能力竞赛”预赛的.doc...
  • EXP-00091:正在导出有问题的统计信息
  • 计算机软考能申请正高职称吗,拿到软考证书后如何申请评职称
  • 指定开始字符串和结束字符串,截取中间的字符
  • 编译原理在计算机专业,编译原理(高等学校计算机专业教材)
  • 湖北第二师范学院计算机类师范类,2018湖北第二师范学院专业排名及分数线
  • 初探数字签名与数字证书
  • 计算机在煤矿安全上有什么作用,计算机技术在煤矿安全生产中应用.pdf
  • 在maven中运行java main函数的方法
  • 怎样查看计算机USB接口的版本,如何查询计算机的USB接口的版本?
  • WordPress修改固定链接
  • 〔开发系列〕一次关于小程序开发的深度总结
  • mysql 数据库四种事务隔离级别
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PAT A1120
  • Puppeteer:浏览器控制器
  • 给新手的新浪微博 SDK 集成教程【一】
  • 利用jquery编写加法运算验证码
  • 驱动程序原理
  • 一些关于Rust在2019年的思考
  • 译有关态射的一切
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #Linux(make工具和makefile文件以及makefile语法)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (23)Linux的软硬连接
  • (70min)字节暑假实习二面(已挂)
  • (8)STL算法之替换
  • (C++17) std算法之执行策略 execution
  • (Python) SOAP Web Service (HTTP POST)
  • (vue)页面文件上传获取:action地址
  • (安卓)跳转应用市场APP详情页的方式
  • (第二周)效能测试
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (一)为什么要选择C++
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)EOS中账户、钱包和密钥的关系
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET企业级应用架构设计系列之开场白
  • //解决validator验证插件多个name相同只验证第一的问题
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Not - Empty-Null-Blank
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [20171113]修改表结构删除列相关问题4.txt
  • [c]统计数字
  • [C++]类和对象【下】
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败