QT虚拟小键盘设计--qt事件循环,事件发送的理解
有人讲到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::
有启发性的一篇文章:
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事件循环,事件发送的理解相关推荐
- Qt 之 Eventloop 事件循环
文章目录 需求 QEventLoop Demo1- 登录 Demo2- 延时 Demo3- 在程序中等待服务器返回 理解QT事件循环 事件循环抽象 Qt是事件驱动的 Qt常见事件 Qt事件从哪里来 Q ...
- 【nodejs原理源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
[摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...
- 工作流 节点子线程_节点JS体系结构–单线程事件循环
工作流 节点子线程 Today we will look into Node JS Architecture and Single Threaded Event Loop model. In our ...
- 八七、Node.js事件循环与多进程
nodejs事件循环与多进程 why 事件循环对于深入理解nodejs异步至关重要 fs, net,http,events 事件循环是企业面试中的最高频考题之一 能驾驭nodejs多进程是一名资深前端 ...
- 深入理解qemu事件循环 —— 基本框架
文章目录 Glib 事件循环 简述 事件循环状态机 demo 定制事件源,回调函数 定制事件源,回调函数和状态机回调函数 QEMU事件循环 事件循环初始化 状态机回调函数的定制 事件源的定制 poll ...
- js---对事件循环宏任务和微任务的理解
一.JS特点 Js作为一门单线程语言,即一次只能完成一个任务,当有多个任务时,任务就得进行排队等待执行,只能等待自己的前一个任务执行完成后自己才能执行. 二.JS事件循环 要理解JS的事件循环的就必须 ...
- js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)...
javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环 ...
- JavaScript事件循环探索
一直对js的事件循环不是很清晰,最近看了JavaScript忍者秘籍的第13章后,有了一些感悟,特此总结一下,分享给大家. 单线程 众所周知,JavaScript是单线程执行模型,同一时刻只能执行一个 ...
- 创建一个storageevent事件_事件循环:微任务和宏任务
浏览器中 JavaScript 的执行流程和 Node.js 中的流程都是基于 事件循环 的. 理解事件循环的工作方式对于代码优化很重要,有时对于正确的架构也很重要. 在本章中,我们首先介绍有关事物工 ...
- 技术干货 | JavaScript 之事件循环(Event Loop)
导读:学过 JavaScript(下文简称 JS) 的都知道它是一门单线程的.非阻塞的脚本语言.单线程意味着,JS 代码在执行的任何时候,都只有一个主线程来处理所有的任务,这也就意味着 JS 无法进行 ...
最新文章
- [JS] for-each和map()的区别
- 基于opencv实现图像差异检测
- 关于私有云与存储风向的深度解读
- Cocos2d-X中的ZORDER和Tag
- auth 认证组件的补充
- 企业要顺应社会生态环境
- raid卡组不同raid_RAID磁盘阵列是如何运作的?
- python 调c++生成的dll 中识别char *_基于tensorflow 实现端到端的OCR:二代身份证号识别...
- 军用计算机通用规范测试试验,军用装备环境可靠性试验项目表
- 计算机第四轮学科评估排名,最权威中国高校学科排名,全国第四轮学科评估结果出炉!...
- 简单实现查找题库随机出题, 且可点击查看对应答案
- Window应急响应(七 NesMiner挖矿病毒)
- 设配器模式不止是补救,有时更像是一个创造者
- 大白话、最简单——SpringBoot+Mybatis+freemarker整合(二)
- 计算机使用的显示器主要有两类,2015年计算机专转本预测题及答案
- 一个小白轻松月入上万块的线上冷门项目
- perl中的grep函数介绍
- 科学家研发出新型金属有机框架材料,不仅能滤海水中的盐还可提取金属离子...
- uni-app 超详细教程(三)(从菜鸟到大佬)
- 【GDOI2016模拟4.23】飞机调度
热门文章
- 477.汉明距离总和
- MFSK以及MFSK和MPSK的对比
- 向量组A可以由一个向量组B表出,并且A的秩小于B的秩,那么A线性相关
- 应急响应的整体思路一
- php phdfs扩展,hadoop HDFS的PHP扩展—PHDFS
- 《Web漏洞防护》读书笔记——第10章,反序列化漏洞防护
- java 微信 百度地图,android 百度地图gps转百度地图坐标java.lang.UnsatisfiedLinkError: CoordinateEncryptEx...
- signature=ed12edba242e439d545c9f98deb5e896,PROJECTION APPARATUS
- 庖丁解牛之spring源码系列一
- 浮动元素遇到标准流元素 会发生转角遇到爱