Qt使用I.MX6U开发板上的按键(原理:将电脑键盘方向键↓在Qt中的枚举值与开发板中按键定义的枚举值一致,这样电脑端测试效果就与开发板的一致)

news2024/11/25 0:36:05

在上篇介绍了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开发板上的按键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一个 Go 程序“hello,world“ 与 main 函数

第一个 Go 程序"hello&#xff0c;world" 与 main 函数 文章目录 第一个 Go 程序"hello&#xff0c;world" 与 main 函数一.创建“hello&#xff0c;world”示例程序二. “hello&#xff0c;world” 程序结构拆解三、main 函数四、Go 语言中程序是怎么编译…

selenium+python实现基本自动化测试

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

坚鹏:浙江农商联合银行同业核心产品解读与差异化分析培训第7期

浙江农商联合银行同业核心产品解读与差异化分析培训第7期 1952年&#xff0c;浙江第一家农村信用社成立。2004年4月18日&#xff0c;浙江省农信联社成立&#xff0c;承担对全省农信社的管理、指导、协调和服务职能。2021年10月&#xff0c;经国务院批准同意、银保监会批复&…

多目标优化算法:基于非支配排序的鱼鹰优化算法(NSOOA)MATLAB

一、鱼鹰优化算法 鱼鹰优化算法&#xff08;Osprey optimization algorithm&#xff0c;OOA&#xff09;由Mohammad Dehghani 和 Pavel Trojovsk于2023年提出&#xff0c;其模拟鱼鹰的捕食行为。 Python&#xff1a;鱼鹰优化算法&#xff08;Osprey optimization algorithm&a…

自动驾驶中的决策规划

参考: 【干货篇】轻舟智航&#xff1a;自动驾驶中的决策规划技术&#xff08;附视频回放 PPT 下载&#xff09; - AIQ 如图所示, 各模块介绍 定位模块主要负责解答的问题是“车现在在哪里”&#xff0c;是在道路上还是在路口&#xff0c;是在高架桥上还是在停车场里。 感知…

图像锐化,求图像锐化后的图像(数字图像处理大题复习 P6)

文章目录 1. 梯度差分方法 & 罗伯特差分法梯度差分方法罗伯特差分法使用梯度差分法解决本题 2. 有阈值 (T4) 的二值图像输出 用不同图像输出方法求图像锐化后的图像 g(x, y) 梯度图像直接输出设阈值 T4&#xff0c;求二值图像输出 1. 梯度差分方法 & 罗伯特差分法 梯度…

C++ Qt零基础入门进阶与企业级项目实战教程与学习方法分享

Qt是一个卓越的客户端跨平台开发框架&#xff0c;可以在Windows、Linux、macOS进行客户端开发&#xff0c;无缝切换&#xff0c;一统三端&#xff1b;当然除了桌面端&#xff0c;在移动端的早期&#xff0c;Qt也展现了其多才多艺&#xff0c;在Android和ios也可以使用Qt编写app…

外部打开微信小程序支付,H5 、APP

手机浏览器H5打开微信小程序支付&#xff0c;自定义传参_h5调起微信小程序支付_我是小木木的博客-CSDN博客H5网站打开小程序&#xff0c;调用小程序支付功能_h5调起微信小程序支付https://blog.csdn.net/chen_mumu119/article/details/132104048

**20.迭代器模式(Iterator)

意图&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。 上下文&#xff1a;集合对象内部结构常常变化各异。对于这些集合对象&#xff0c;能否在不暴露其内部结构的同时&#xff0c;让外部Client透明地访问其中包含的元素…

大数据+大模型的尽头——数据分析师的未来会怎样?

大数据大模型的尽头一定是干掉数据分析师吗&#xff1f; | 近匠

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…

如何与Linamar Corp 建立EDI连接?

Linamar Corp&#xff08;以下简称Linamar&#xff09;是一家全球领先的汽车零部件制造商&#xff0c;总部位于加拿大。随着业务的不断扩展&#xff0c;Linamar 需要与其供应商、分销商和合作伙伴之间实现更高效的业务交流和数据共享。为了提高业务流程的自动化水平&#xff0c…

1.虚拟机无法连接网络,且无法ping通的问题解决

1.介绍 今天操作Jedis连接虚拟机的redis数据库时&#xff0c;连接不上&#xff0c;找了很多解决方案&#xff0c;都解决不了&#xff0c;最后发现是虚拟机的配置问题&#xff0c;虚拟机无法连接网络&#xff0c;且没有设置本机ip地址&#xff0c;所以ifconfig的根本就查不出ip…

C++之智能指针类型转换应用总结(二百二十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

数据结构:线性表之-队列

目录 什么是队列&#xff1f; 详解&#xff1a; 功能介绍 代码实现 定义队列基本结构 1&#xff0c;初始化 2, 销毁 3,尾入数据 4,头出数据 5,取队头的数据 6,取队尾的数据 7,判断是否为空 8,计算队列中的元素 成品 Queue.h Queue.c test.c 队列的讲解将建立在…

Oracle使用遇到的问题

一、Navicat 连接Orcle提示 Oracle library is not loaded 1.前往官网下载客户端 http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html 2.选择与系统匹配的“Instant Client”和sqlpus。

App的专项测试

文章目录 App的专项测试都从哪个方面测试安装和卸载版本升级消息推送弱网测试兼容性测试交互性测试 App的专项测试都从哪个方面测试 在APP测试过程中&#xff0c;除了功能测试外&#xff0c;还需要进行一些专项测试来发现更为深层的问题&#xff0c;这些问题主要是针对某个特殊…

时空智友企业流程化管控系统文件存在任意文件上传漏洞 附POC

、 文章目录 时空智友企业流程化管控系统文件存在任意文件上传漏洞 附POC1. 时空智友企业流程化管控系统文件简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 时空智友企业流程化管控系统文件存在任意文件上传漏洞 附POC 免责声明&#…

【Redis】深入探索 Redis 的哨兵(Sentinel)机制原理,基于 Docker 模拟搭建 Redis 主从结构和哨兵分布式架构

文章目录 一、对 Redis Sentinel 的认识1.1 什么是 Redis Sentinel1.2 为什么要使用 Redis Sentinel1.2.1 主从复制问题1.2.2 人工恢复主节点故障 二、Redis Sentinel 原理剖析2.1 Redis Sentinel 架构2.2 Raft 算法和领袖节点2.3 哨兵节点2.4 故障检测2.5 故障切换2.6 监控和通…

Android调用相册并展示选中的图片

调用相册 //定义请求码int PICK_PHOTO_REQUEST 1234;int RESULT_CANCELED 0;//定义取消码//触发监听后调用相册findViewById(R.id.image_gallery).setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {//创建一个意图并开启startActivi…