Qt使用I.MX6U开发板上的按键(原理:将电脑键盘方向键↓在Qt中的枚举值与开发板中按键定义的枚举值一致,这样电脑端测试效果就与开发板的一致)
在上篇介绍了Qt点亮I.MX6U开发板的一个LED
,对于Qt控制I.MX6U开发板的一个蜂鸣器原理也是一样的,就不做详细介绍,具体可参考Qt控制I.MX6U开发板的一个蜂鸣器,本篇介绍Qt使用I.MX6U开发板上的按键的相关内容。
文章目录
- 1. 开发板硬件图及板卡按键在电脑键盘中的对应原理
- 2. 出厂内核设备树中注册的按键
- 3. 如何看这个按键的键值对应键盘中的按键
- 4. 程序开发
- 4.1 项目简介
- 4.2 mainwindow.h
- 4.3 mainwindow.cpp
- 4.4 程序运行效果
1. 开发板硬件图及板卡按键在电脑键盘中的对应原理
打开“【正点原子】I.MX6U嵌入式Qt开发指南V1.0.21”
,该文件最前面就是开发板的硬件图。
上面第一个图中的时阿尔法的板子,下为6U的MINI版,6U的IO比较紧张,所以就只留了一个IO给上图中的黄色按键使用。
Qt开发是如何识别6U的key0
按键并在电脑上进行程序开发呢?
我们知道Qt可以识别键盘输入,键盘即是按键,那是否可以将开发板上的按键当做键盘上的按键呢?
这样当然也是可以的,Qt可以识别键盘上的输入,键盘上的数值
早在系统的底层编好码了,系统就可以识别这种编码。同理,将开发板上的按键进行编码,系统也就可以识别这种编码。只要两者对应起来就可以实现电脑测试效果与开发板测试效果一致。
本篇将会介绍在开发板中已经配置了"#define KEY_VOLUMEDOWN 114"的情况下,同样使用电脑键盘在Qt中定义的“KEY_VOLUMEDOWN”枚举进行代替(对应了键盘方向键↓)仿真,后将通用的代码拷贝到开发板中进行测试。
2. 出厂内核设备树中注册的按键
l.MX6U设备树路径为:arch/arm/boot/dts/imx6ull-14x14-evk.dts
STM32MP157设备树路径为:arch/arm/boot/dts/stm32mp157datk.dts
对开发板上的按键进行编码,系统就可以识别编码。下面应该就是l.MX6U板卡Linux源码的关于按键部分的内容-按键的驱动
对开发板上的按键进行编码,键值设置为114
也就是完成了编码。114是对应键盘中的哪个值呢?
3. 如何看这个按键的键值对应键盘中的按键
键值宏定义是在<linux/input.h>头文件中
下图在Linux中按键的键值在键盘中是无法找到的,此处配置的是比较特殊的:“#define KEY_VOLUMEDOWN 114”,KEY_VOLUMEDOWN
也就是音量的加减键
,老的电脑键盘上可能可以找到,现在的键盘都是用上下键
来实现音量的加减等功能,但是现在手机上还是有音量的加减键的(这是因为手机的系统是安卓,安卓的底层也是linux)。
想要监测这个 KEY0,首先正点原子的出厂内核已经默认将这个按键注册成了 gpio-keys 类型设备,键值为 114 也就是对应 Qt 的 Key_VolumeDown 键值。 也就是说我们可以直接当这个按键是我们普通键盘的音量减键使用(注意键值为 114 的按键比较特殊,并不能直接在我们普通的键盘上找到,有些笔记本电脑使用 FN + F6 等组合直接代替了音量减键)。
4. 程序开发
4.1 项目简介
我们在本例中使用 Key_Down(键盘方向键↓)在Windows/Ubuntu 上测试,在开发板上还是使用 KEY0 按键测试。
在开发板监测这个 KEY0 有很多方法。 比如使用 C 语言开一个线程监测这个按键,或者按本例重写键盘事件来监测 KEY0 按键按下或者松开。
项目简介: 监测 KEY0 按键的按下和松开。 使用一个标签文本, 通过按键按下来改变标签文本的文字属性。
4.2 mainwindow.h
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3 4
#include <QMainWindow>
5 #include <QKeyEvent>
6 #include <QLabel>
7 #include <QDebug>
8 #include <QEvent>
9
10 class MainWindow : public QMainWindow
11 {
12 Q_OBJECT
13
14 public:
15 MainWindow(QWidget *parent = nullptr);
16 ~MainWindow();
17
18 private:
19 /* 标签文本 */
20 QLabel *label;
21
22 /* 重写按键事件 */
23 void keyPressEvent(QKeyEvent *event);
24 void keyReleaseEvent(QKeyEvent *event);
25 };
26
27 #endif // MAINWINDOW_H
第 23~24 行,声明需要重写的按键事件类型。分别是按下事件和松开事件。通过重写这两个事件可以监测到键盘或 KEY0 按下的状态。
4.3 mainwindow.cpp
#include "mainwindow.h"
2 #include <QGuiApplication>
3 #include <QScreen>
4 #include <QRect>
5 6
MainWindow::MainWindow(QWidget *parent)
7 : QMainWindow(parent)
8 {
9 /* 获取屏幕的分辨率, Qt 官方建议使用这
10 * 种方法获取屏幕分辨率,防上多屏设备导致对应不上
11 * 注意,这是获取整个桌面系统的分辨率
12 */
13 QList <QScreen *> list_screen = QGuiApplication::screens();
14
15 /* 如果是 ARM 平台,直接设置大小为屏幕的大小 */
16 #if __arm__
17 /* 重设大小 */
18 this->resize(list_screen.at(0)->geometry().width(),
19 list_screen.at(0)->geometry().height());
20 #else
21 /* 否则则设置主窗体大小为 800x480 */
22 this->setGeometry(0, 0, 800, 480);
23 #endif
24
25 /* 标签实例化 */
26 label = new QLabel(this);
27
28 /* 设置默认文本 */
29 #if __arm__
30 label->setText("VolumeDown 松开状态");
31 #else
32 label->setText("Down 按键松开");
33 #endif
34
35 /* 设置对齐方式 */
36 label->setAlignment(Qt::AlignCenter);
37
38 /* 居中显示 */
39 setCentralWidget(label);
40 }
41
42 MainWindow::~MainWindow()
43 {
44 }
45
46 void MainWindow::keyPressEvent(QKeyEvent *event)
47 {
48 #if __arm__
49 /* 判断按下的按键,也就是板子 KEY0 按键 */
50 if(event->key() == Qt::Key_VolumeDown) {
51 /* 设置 label 的文本 */
52 label->setText("VolumeDown 按键按下");
53 }
54 #else
55 /* 判断按下的按键,也就是"↓"方向键 */
56 if(event->key() == Qt::Key_Down) {
57 /* 设置 label 的文本 */
58 label->setText("Down 按键按下");
59 }
60
61 #endif
62 /* 保存默认事件 */
63 QWidget::keyPressEvent(event);
64 }
65
66 void MainWindow::keyReleaseEvent(QKeyEvent *event)
67 {
68 #if __arm__
69 /* 判断松开的按键,也就是板子 KEY0 按键 */
70 if(event->key() == Qt::Key_VolumeDown) {
71 /* 设置 label 的文本 */
72 label->setText("VolumeDown 按键松开");
73 }
74 #else
75 /* 判断按下的按键,也就是"↓"方向键 */
76 if(event->key() == Qt::Key_Down) {
77 /* 设置 label 的文本 */
78 label->setText("Down 按键松开");
79 }
80 #endif
81 /* 保存默认事件 */
82 QWidget::keyReleaseEvent(event);
83 }
第 9 行~23 行,界面初始化设置,在嵌入式里,根据实际的屏的大小,设置全屏显示。按钮居中显示。
第 46~83 行, 重写按下事件和松开事件,通过判断event->key()等哪个按键,就可以知道是哪个按键按下或者松开了。 并设置了标签文本的属性。
4.4 程序运行效果
Ubuntu/Windows 上当焦点聚集到此应用程序窗口时,按下方向键“↓”,标签文本的值会改变为“Down 按键按下”,当松开方向键“↓”,标签的文本值会改变为默认状态“Down 按键松开”。
同理在开发板上,按下 KEY0 键则会打印“VolumeDown 按键按下”,松开 KEY0 键会打印“VolumeDown 按键松开”。
实际测试时代码不同,只是使用对应的枚举来改变界面效果,实际运行效果如下:按钮按下后界面改变,并会提示按键按下
对应地址:Qt使用I.MX6U开发板上的按键
相关文章:
Qt使用I.MX6U开发板上的按键(原理:将电脑键盘方向键↓在Qt中的枚举值与开发板中按键定义的枚举值一致,这样电脑端测试效果就与开发板的一致)
在上篇介绍了Qt点亮I.MX6U开发板的一个LED,对于Qt控制I.MX6U开发板的一个蜂鸣器原理也是一样的,就不做详细介绍,具体可参考Qt控制I.MX6U开发板的一个蜂鸣器,本篇介绍Qt使用I.MX6U开发板上的按键的相关内容。 文章目录 1. 开发板硬…...
C++ RAII在HotSpot VM中的重要应用
RAII(Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,是C语言的一种管理资源、避免泄漏的惯用法。C标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单…...
python随手小练
题目: 使用python做一个简单的英雄联盟商城登录界面 具体操作: print("英雄联盟商城登录界面") print("~ * "*15 "~") #找其规律 a "1、用户登录" b "2、新用户注册" c "3、退出系统&quo…...
MySQL——函数和流程控制
2023.9.21 函数 含义:一组预先编译好的SQL语句的集合,理解成批处理语句。 提高代码的重用性简化操作减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率 与存储过程的区别: 存储过程:可以有0个返回&am…...
【Vue3 源码讲解】nextTick
nextTick 是 Vue 3 中用于异步执行回调函数的函数,它会将回调函数延迟到下一个微任务队列中执行。其中,Vue 更新 DOM 是异步的。下面是对 nextTick 函数的详细解释: export function nextTick<T void, R void>(this: T,fn?: (this:…...
什么是ATR,在聚宽量化平台如何计算ATR
海龟们使用两种资金管理方法。首先,我们把头寸分成一个个小块。这样,即使一笔交易赔了钱,我们损失的也只是一个头寸的一部分。里奇和比尔把这些小块称作头寸单位。其次,我们使用里奇和比尔发明的一种创新性的头寸规模决定方法。这…...
Python 爬虫实战之爬淘宝商品并做数据分析
前言 是这样的,之前接了一个金主的单子,他想在淘宝开个小鱼零食的网店,想对目前这个市场上的商品做一些分析,本来手动去做统计和分析也是可以的,这些信息都是对外展示的,只是手动比较麻烦,所以…...
Python爬虫-requests.exceptions.SSLError: HTTPSConnectionPool疑难杂症解决(1)
前言 本文是该专栏的第7篇,后面会持续分享python爬虫案例干货,记得关注。 在爬虫项目开发中,偶尔可能会遇到SSL验证问题“requests.exceptions.SSLError: HTTPSConnectionPool(host=www.xxxxxx.com, port=443): Max retries exceeded with url ...”。亦或是验证之后的提示…...
12:STM32---RTC实时时钟
目录 一:时间相关 1:Unix时间戳 2: UTC/GMT 3:时间戳转化 二:BKP 1:简历 2:基本结构 三: RTC 1:简历 2: 框图 3:RTC基本结构 4:RTC操作注意 四:案例 A:读写备份寄存器 1:连接图 2: 步骤 3: 代码 B:实时时钟 1:连接图 2:函数介绍 3:代码 一:时间相关 1:Un…...
【动态规划刷题 16】最长等差数列 (有难度) 等差数列划分 II - 子序列
1027. 最长等差数列 https://leetcode.cn/problems/longest-arithmetic-subsequence/ 给你一个整数数组 nums,返回 nums 中最长等差子序列的长度。 回想一下,nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] ,且 0 < i1 <…...
【postgresql】替换 mysql 中的ifnull()
数据库由mysql 迁移到postgresql,程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…...
单例模式(懒汉式,饿汉式,变体)
单例模式,用于确保一个类只有一个实例,并提供一个全局访问点以访问该实例。 饿汉式(Eager Initialization) 程序启动时就创建实例 #include <iostream> class SingletonEager { private:static SingletonEager* instanc…...
Java Lambda表达式:简洁且强大的函数式编程工具
Lambda表达式是Java 8及以后版本中引入的一种函数式编程特性。它是一种匿名函数,允许开发人员以简洁和易读的方式编写代码,并且可以作为参数传递给方法或存储在变量中。Lambda表达式的基本语法如下:(parameters) -> expression,…...
开源框架中的责任链模式实践
作者:vivo 互联网服务器团队-Wang Zhi 责任链模式作为常用的设计模式而被大家熟知和使用。本文介绍责任链的常见实现方式,并结合开源框架如Dubbo、Sentinel等进行延伸探讨。 一、责任链介绍 在GoF 的《设计模式》一书中对责任链模定义的:将…...
智能配电系统:保障电力运行安全、可控与高效
智能配电系统是一种先进的电力分配技术,它通过智能化、数字化和网络化等方式,有效地保障了电力运行的安全、可控和高效。 力安科技智能配电系统是在配电室(含高压柜、变压器、低压柜)、箱式变电站、配电箱及动力柜(…...
MySQL学习系列(11)-每天学习10个知识
目录 1. 数据库设计的关键因素2. 使用存储过程和函数来提高性能和可重用性3. MySQL性能优化4. 使用视图简化查询和提供数据安全性5. 数据库备份和恢复策略的重要性和实践经验6. 在分布式系统中保证数据一致性和可用性7. 理解MySQL的复制和其在实际应用中的作用8. 使用游标进行分…...
如何通过Gunicorn和Niginx部署Django
本文主要介绍如何配置Niginx加载Django的静态资源文件,也就是Static 1、首先需要将Django项目中的Settings.py 文件中的两个参数做以下设置: STATIC_URL /static/ STATIC_ROOT os.path.join(BASE_DIR, static) 然后在宝塔面板中执行python manage.…...
C语言 cortex-A7核UART总线实验
一、C 1)uart4.h #ifndef __UART4_H__ #define __UART4_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h&quo…...
asp.net C#免费反编译工具ILSpy
在维护一个没有源码的C#项目,只能反编译了。 项目主页 https://github.com/icsharpcode/ILSpy 使用方法 中文界面使用简单,把你要反编译的dll拖过去就可以了。好使!!!...
演讲实录:DataFun 垂直开发者社区基于指标平台自主洞察北极星指标
在7月14日举办的 Kyligence 用户大会的数智新应用论坛上,DataFun COO 杜颖女士为大家带来了《垂直开发者社区基于指标平台自主洞察北极星指标》的主题演讲。接下来,我们一起看看 DataFun 如何在没有专门的 IT 团队的情况下,实现对北极星指标的…...
ffmpeg编译 Error: operand type mismatch for `shr‘
错误如下: D:\msys2\tmp\ccUxvBjQ.s: Assembler messages: D:\msys2\tmp\ccUxvBjQ.s:345: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:410: Error: operand type mismatch for shr D:\msys2\tmp\ccUxvBjQ.s:470: Error: operand type mismatch…...
【Windows Server 2012 R2搭建FTP站点】
打开服务器管理器——添加角色和功能 下一步 下一步 下一步 选择FTP服务器,勾上FTP服务和FTP扩展,点击下一步 安装 安装完成关闭 打开我们的IIS服务器 在WIN-XXX主页可以看到我们的FTP相关菜单 右键WIN-XXXX主页,添加FTP站点 输入站点名称-FT…...
python教程:使用gevent实现高并发并限制最大并发数
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 import time import gevent from gevent.pool import Pool from gevent import monkey # 一,定义最大并发数 p Pool(20) # 二,导入gevent…...
借助reCAPTCHA实现JavaScript验证码功能
前言 验证码(CAPTCHA)是一种常见的安全验证机制,常用于区分真实用户和机器人。使用验证码可以有效防止恶意登录、自动注册或者密码爆破等攻击。本文将借助reCAPTCHA第三方库来实现JavaScript验证码功能。 验证码的原理 验证码的核心思想是要…...
监控数据的采集方式及原理
采集方法使用频率从高到低依次是读取 /proc目录、执行命令行工具、远程黑盒探测、拉取特定协议的数据、连接到目标对象执行命令、代码埋点、日志解析。 读取 /proc目录 /proc是一个位于内存中的伪文件系统,而在该目录下保存的不是真正的文件和目录,而是…...
Vue路由与node.js环境搭建
目录 前言 一.Vue路由 1.什么是spa 1.1简介 1.2 spa的特点 1.3 spa的优势以及未来的挑战 2.路由的使用 2.1 导入JS依赖 2.2 定义两个组件 2.3 定义组件与路径对应关系 2.4 通过路由关系获取路由对象 2.5 将对象挂载到vue实例中 2.6 定义触发路由事件的按钮 2.7 定…...
腾讯云16核服务器性能测评_轻量和CVM配置大全
腾讯云16核服务器配置大全,CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等,目前标准型S5云服务器有优惠活动,性价比高,计算型C6云服务器16核性能更高,轻量16核32G28M带宽优惠价3468元15个月,…...
Postman应用——下载注册和登录
文章目录 下载安装注册登录注册账号登录账号 下载安装 Postman下载:https://www.postman.com/ 访问链接后,进入首页,根据自己的操作系统下载对应的版本。 找到下载到的目录直接双击.exe文件,会默认安装在C盘,安装完会…...
uni-app混合开发 navigateTo、reLaunch、redirectTo、switchTab区别
1.navigateTo 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 要注意的是navigateTo只能跳转的应用内非 tabBar 的页面的路径 , 路径后可以带参数;如果跳转url参数为tabBar的路径则无法进行跳转 2.redir…...
专业软件测评中心:关于软件性能测试的实用建议
软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。 一、软件性能测试的实用建议 1、制定清晰的测试目标:明确测试目标…...
南昌网站小程序开发/seo公司运营
一:依赖关系 1:依赖和血缘关系介绍 rdd.todebugstring:打印血缘关系 rdd.dependencies:打印依赖关系 2:保存血缘关系 3:OneToOne依赖---窄依赖 4:shuffle依赖--宽依赖 新的RDD的一个分区的数据…...
五道口网站建设/品牌公关公司
在做混合开发时发现,无论是APP内的字体大小,还是前端的字体大小,都会随着系统字体大小发生变化。当遇到老人字体(特大号字体)时,有些页面的布局就乱掉了。而玩过游戏的都知道,所有游戏APP的字体…...
可以看网站的浏览器/2345网址大全下载到桌面
一、问题 在使用latex写英文论文时遇到一个问题,不知道如何输入藏文字符或者藏语字体,经过查询,实现了如何使用latex显示藏语文字,具体过程分享给大家参考。 二、实现步骤 导入两个包 \usepackage{fontspec} \setmainfont{Micro…...
西宁网站制作哪里好/新媒体营销案例ppt
属性striped设置为true,即striped:true。 如果想更改颜色,可以更改easyui.css中的.datagrid-row-alt样式。转载于:https://www.cnblogs.com/hubing/p/3969599.html...
织梦网站搜索怎么做/百度认证官网
常见Python爬虫工具总结 前言 以前写爬虫都是用requests包,虽然很好用,不过还是要封装一些header啊什么的,也没有用过无头浏览器,今天偶然接触了一下。 原因是在处理一个错误的时候,用到了几个以前没有用过的工具&…...
宝安专业网站设计多少钱/百度竞价推广价格
转自:http://blog.csdn.net/joker0910/article/details/7171626 内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init 、__devinit 等。这些宏在include/linux/init.h 头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置ÿ…...