有人讲到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等)用户程序之间进行通信。

QT虚拟小键盘设计--qt事件循环,事件发送的理解的更多相关文章

  1. lufylegend库 鼠标事件 循环事件 键盘事件

    lufylegend库 鼠标事件 循环事件 键盘事件 <!DOCTYPE html> <html lang="en"> <head> <m ...

  2. QDialog 模态对话框与事件循环(exec其实就是调用了show和eventLoop.exec)

    起源 qtcn中文论坛中有网友问到: 假设程序正常运行时,只有一个简单的窗体A,此时只有一个GUI主线程,在这个主线程中有一个事件循环处理窗体上的事件.当此程序运行到某阶段时,弹出一个模态窗体B(书上 ...

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

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

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

    目录 Event Loop 是什么? Event Loop 基本解释 事件循环阶段概览 事件循环细节 timers pending callbacks poll阶段 check close callb ...

  5. JavaScript事件循环机制

    事件循环 事件循环不仅仅包含事件队列,而是具有至少两个队列,除了事件,还要保持浏览器执行的其他操作.这些操作被称为任务,并且分为两类:宏任务(或通常称为任务)和微任务. 单次循环迭代中,最多处理一个宏 ...

  6. [浏览器事件循环] javaScript事件循环 EventLoop

    前言 Event Loop即事件循环,是指浏览器或Node的一种解决javaScript单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理. 先熟悉基本概念 [堆Heap] 堆是一种数据结构 ...

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

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

  8. JavaScript Concurrency model and Event Loop 并发模型和事件循环机制

    原文地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop JavaScript 有一个基于 event loop 的 ...

  9. node.js学习笔记(三)——事件循环

    要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...

随机推荐

  1. 学习Spring-Data-Jpa(十四)---自定义Repository

    有些时候,我们需要自定义Repository实现一些特殊的业务场景. 1.自定义单个Repository 1.1.首先提供一个片段接口和实现(接口的实现默认要使用Impl为后缀,实现本身不依赖spri ...

  2. Otsu 类间方差法

    又称最大类间方差法.是由日本学者大津(Nobuyuki Otsu)于1979年提出的[1],是一种自适合于双峰情况的自动求取阈值的方法.又叫大津法,简称Otsu.   算法提出初衷是是按图像的灰度特性 ...

  3. python3 爬虫继续爬笔趣阁 ,,,,,,,

    学如逆水行舟,不进则退 今天想看小说..找了半天,没有资源.. 只能自己爬了 想了半天.,,,忘记了这个古老的技能 捡了一下 import requests from bs4 import Beaut ...

  4. ArrayList 集合:库存管理

    import java.util.ArrayList; import java.lang.Integer; import java.util.Scanner; import java.util.Ran ...

  5. linux命令之------快捷键说明

    linux快捷键说明 (1)命令或目录补齐:Tab (2)遍历历史记录:history 上移:ctrl+p,下移:ctrl+n (3)光标移动 左移:ctrl+b:右移:ctrl+f:移到首部:ctr ...

  6. nginx配置url重定向&反代

    一.重定向 正则表达式匹配: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配: * -f和!-f用来判断是否存在文件 ...

  7. vim 注释颜色

    方法一 修改 vim 配置文件 /etc/vim/vimrc (1)用vim打开 /etc/vim/vimrc文件 (2)按大写 ‘G’ 到最后一行,插入   hi comment ctermfg=6 ...

  8. 关于简单的 FluentValidation 验证

    FluentValidation :  https://github.com/JeremySkinner/FluentValidation 关于为何要使用,因为微软自带的模型验证有点弱,还需要自己去写 ...

  9. 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World

    目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...

  10. CTF CMS(转)

    CTF--CMS漏洞总结 海洋CMS 6.28 海洋CMS6.28命令执行漏洞 6.45-6.54 漏洞预警 | 海洋CMS(SEACMS)0day漏洞预警 8.8(未验证) 海洋cms前台到后台的g ...