有人讲到QT5.7及其以后的版本才自带免费的小键盘插件。

QT5.10中关于QKeyEvent类:点击打开链接

QT sendEvent和PostEvent, 点击打开链接

my god,我今天安装了QT5.10,在帮助文档中有现成的虚拟键盘的例子,在帮助界面直接查找(不是索引) Qt Virtual Keyboard Examples即可。

oh, stackover上一个老兄有一个相似的问题:点击打开链接

探索过程:

1) 关于使用QT插件,QT输入法:点击打开链接

2)在程序中发出系统的按键按下的消息,用QKeyEvent,这样的话当前处于焦点状态的控件可以自动接收到信号。

qt中sendEvent()和postEvent()函数的区别

https://blog.csdn.net/lvmengzou/article/details/65450908

https://stackoverflow.com/questions/44329296/qt-qt-cannot-send-events-to-objects-owned-by-a-different-thread-why

注意,如果在不同的线程之间传送信号,只能用postevent函数!

QT事件循环的理解:

1. https://blog.csdn.net/autumn20080101/article/details/9966359 解释:

“1) 事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行机会,直至程序从exec()跳出。从exec()跳出时,事件循环即被终止。QEventLoop::quit()能够终止事件循环。

其次,之所以被称为“事件”循环,是因为它能接收事件,并处理之。当事件太多而不能马上处理完的时候,待处理事件被放在一个“队列”里,称为“事件循环队列”。当事件循环处理完一个事件后,就从“事件循环队列”中取出下一个事件处理之。当事件循环队列为空的时候,它和一个啥事也不做的永真循环有点类似,但是和永真循环不同的是,事件循环不会大量占用CPU资源。

事件循环的本质就是以队列的方式再次分配线程时间片。

2)事件循环是可以嵌套的,一层套一层,子层的事件循环执行exec()的时候,父层事件循环就处于中断状态;当子层事件循环跳出exec()后,父层事件循环才能继续循环下去。”

2.

“Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行

exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于

QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对

象按照它们不同的类型,分发给不同的事件处理器(event handler).”

“Qt programs like any other GUI programs has a main loop. You can't see it, but it exists in QApplication::exec() function. It catches all kind of events (internal and external) and calls appropriate handlers in order of occurrence. ”

---------------------------------------------------------------------------------------------------------------

在qt程序中模拟系统按键事件:

https://blog.csdn.net/ssmile/article/details/6297423

我按照如下方法尝试,没有反应。(/dev/input/event0--4,全部的event都试了,注意需要修改这些event文件的读写权限,用root权限)---因为还要发送一个syn信号

void test()
{char *path = "/dev/input/event1";int fd = open(path, O_RDWR);if(fd < 0) {//printf("error open keyboard:%s/n", strerror(errno));return;}struct input_event event;unsigned int key_code = KEY_TAB;event.type = EV_KEY;event.code = key_code;gettimeofday(&event.time, 0);event.value = 4;
//if (write(fd, &event, sizeof(event)) < 0) {//printf("simulate key error/n");return;}else{//printf("simuate key %d, %d/n", keycode, keyvalue);}close(fd);qDebug()<<"UmProg::testQevent() end:";return;
}

另一篇讲模拟linux按键的:https://blog.csdn.net/RadianceBlau/article/details/56487185

input_event结构体各个属性的变量:

/*
 * Event types
 */
#define EV_SYN 0x00   //同步事件
#define EV_KEY 0x01  //  按键事件
#define EV_REL 0x02  //相对坐标
#define EV_ABS 0x03  //绝对坐标
#define EV_MSC 0x04  //其他??
#define EV_SW 0x05
#define EV_LED 0x11 //LED
#define EV_SND 0x12 //sound
#define EV_REP 0x14 //repeat
#define EV_FF         0x15 //力反馈
#define EV_PWR 0x16 //电源
#define EV_FF_STATUS 0x17 //状态
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)

//code::

code的意义与type有关,如果type是按键事件,则不同的code对应不同的按键。如果事件的类型代码是EV_KEY,该代码code为设备键盘代码。代码值0~127为键盘上的按键代码,0x110~0x116为鼠标上按键代码,其中0x110(BTN_LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件.
如果事件的类型代码是EV_REL,code值表示轨迹的类型。如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码 为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).


有启发性的一篇文章

http://www.myexception.cn/qt/1735351.html

"读取Linux的input设备即可,确认你的外接按键是否会走 Linux 标准的 input 流程。

如果不走,实现 Qt 的键盘驱动插件,与驱动对接口,读取按键信息,转换成 Qt 的按键值。在程序启动时,安装你的键盘驱动插件"


一篇文章:https://blog.csdn.net/lzh445096/article/details/46377431

qt键盘驱动映射的实现(kbdhander.h   kbdhander.c)

qt的键盘驱动通常使用一个QsocketNotifier类的对象来检测通过open系统调用打开的键盘设备文件。QsocketNotifier会调用键盘在linux内核空间的file­­­_operations结构体中的轮询函数(poll函数),当有键盘输入时,会放入linux键盘驱动创建的输入缓冲区中,poll函数的返回值会在缓冲区空闲时发生变化。当QsocketNotifier检测到这种变化之后会产生一个activated信号,此信号的槽函数为readKbdData(),槽函数调用read从键盘设备文件中读出内核空间键盘驱动定义的缓冲区中数据。此数据包括type、code和value三个分量,把每个code值与qt库中的标准qt按键值一一对应来定义,这样qt就能感知linux按键的输入了,这就是键盘映射的原理。

QDBus的作用:https://blog.csdn.net/taiyang1987912/article/details/45642079

DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性。

DBus分为两种类型:system bus(系统总线),用于系统(Linux)和用户程序之间进行通信和消息的传递;session bus(回话总线),用于桌面(GNOME, KDE等)用户程序之间进行通信。

转载于:https://www.cnblogs.com/butterflybay/p/10347998.html

QT虚拟小键盘设计--qt事件循环,事件发送的理解相关推荐

  1. Qt 之 Eventloop 事件循环

    文章目录 需求 QEventLoop Demo1- 登录 Demo2- 延时 Demo3- 在程序中等待服务器返回 理解QT事件循环 事件循环抽象 Qt是事件驱动的 Qt常见事件 Qt事件从哪里来 Q ...

  2. 【nodejs原理源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    [摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...

  3. 工作流 节点子线程_节点JS体系结构–单线程事件循环

    工作流 节点子线程 Today we will look into Node JS Architecture and Single Threaded Event Loop model. In our ...

  4. 八七、Node.js事件循环与多进程

    nodejs事件循环与多进程 why 事件循环对于深入理解nodejs异步至关重要 fs, net,http,events 事件循环是企业面试中的最高频考题之一 能驾驭nodejs多进程是一名资深前端 ...

  5. 深入理解qemu事件循环 —— 基本框架

    文章目录 Glib 事件循环 简述 事件循环状态机 demo 定制事件源,回调函数 定制事件源,回调函数和状态机回调函数 QEMU事件循环 事件循环初始化 状态机回调函数的定制 事件源的定制 poll ...

  6. js---对事件循环宏任务和微任务的理解

    一.JS特点 Js作为一门单线程语言,即一次只能完成一个任务,当有多个任务时,任务就得进行排队等待执行,只能等待自己的前一个任务执行完成后自己才能执行. 二.JS事件循环 要理解JS的事件循环的就必须 ...

  7. js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...

    javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...

  8. JavaScript事件循环探索

    一直对js的事件循环不是很清晰,最近看了JavaScript忍者秘籍的第13章后,有了一些感悟,特此总结一下,分享给大家. 单线程 众所周知,JavaScript是单线程执行模型,同一时刻只能执行一个 ...

  9. 创建一个storageevent事件_事件循环:微任务和宏任务

    浏览器中 JavaScript 的执行流程和 Node.js 中的流程都是基于 事件循环 的. 理解事件循环的工作方式对于代码优化很重要,有时对于正确的架构也很重要. 在本章中,我们首先介绍有关事物工 ...

  10. 技术干货 | JavaScript 之事件循环(Event Loop)

    导读:学过 JavaScript(下文简称 JS) 的都知道它是一门单线程的.非阻塞的脚本语言.单线程意味着,JS 代码在执行的任何时候,都只有一个主线程来处理所有的任务,这也就意味着 JS 无法进行 ...

最新文章

  1. [JS] for-each和map()的区别
  2. 基于opencv实现图像差异检测
  3. 关于私有云与存储风向的深度解读
  4. Cocos2d-X中的ZORDER和Tag
  5. auth 认证组件的补充
  6. 企业要顺应社会生态环境
  7. raid卡组不同raid_RAID磁盘阵列是如何运作的?
  8. python 调c++生成的dll 中识别char *_基于tensorflow 实现端到端的OCR:二代身份证号识别...
  9. 军用计算机通用规范测试试验,军用装备环境可靠性试验项目表
  10. 计算机第四轮学科评估排名,最权威中国高校学科排名,全国第四轮学科评估结果出炉!...
  11. 简单实现查找题库随机出题, 且可点击查看对应答案
  12. Window应急响应(七 NesMiner挖矿病毒)
  13. 设配器模式不止是补救,有时更像是一个创造者
  14. 大白话、最简单——SpringBoot+Mybatis+freemarker整合(二)
  15. 计算机使用的显示器主要有两类,2015年计算机专转本预测题及答案
  16. 一个小白轻松月入上万块的线上冷门项目
  17. perl中的grep函数介绍
  18. 科学家研发出新型金属有机框架材料,不仅能滤海水中的盐还可提取金属离子...
  19. uni-app 超详细教程(三)(从菜鸟到大佬)
  20. 【GDOI2016模拟4.23】飞机调度

热门文章

  1. 477.汉明距离总和
  2. MFSK以及MFSK和MPSK的对比
  3. 向量组A可以由一个向量组B表出,并且A的秩小于B的秩,那么A线性相关
  4. 应急响应的整体思路一
  5. php phdfs扩展,hadoop HDFS的PHP扩展—PHDFS
  6. 《Web漏洞防护》读书笔记——第10章,反序列化漏洞防护
  7. java 微信 百度地图,android 百度地图gps转百度地图坐标java.lang.UnsatisfiedLinkError: CoordinateEncryptEx...
  8. signature=ed12edba242e439d545c9f98deb5e896,PROJECTION APPARATUS
  9. 庖丁解牛之spring源码系列一
  10. 浮动元素遇到标准流元素 会发生转角遇到爱