Qt----USER-KEY

41 篇文章 35 订阅

USER-KEY

本章是按键实验,介绍如何在 Qt 应用上使用我们正点原子嵌入式 I.MX6ULL Linux 开发板上的按键。

一、资源简介

在正点原子的 I.MX6U 开发板,ALPHA 和 MINI Linux 开发板板载资源上有一个按键。如下图原理图(下图为 ALPHA 开发板的 KEY0 按键原理图)。

在这里插入图片描述

二、应用实例

想要监测这个 KEY0,首先我们正点原子的出厂内核已经默认将这个按键注册成了gpio-keys 类型设备,键值为 114 也就是对应 Qt 的 Key_VolumeDown 键值。也就是说我们可以直接当这个按键是我们普通键盘的音量减键使用即可(注意键值为 114 的按键比较特殊,并不能直接在我们普通的键盘上找到,有些笔记本电脑直接 FN + F6 等组合直接代替了音量减键)。我们直接使用了 Key_Down(方向键↓)在 Windows/Ubuntu 上测试,在开发板上还是使用 KEY0按键测试。

在开发板监测这个 KEY0 有很多方法。比如使用 C 语言开一个线程监测这个按键,或者按本例一个直接重写键盘事件来监测 KEY0 按键按下或者松开。

项目简介:监测 KEY0 按键的按下和松开。使用一个标签文本,通过按键按下来改变标签文本的文字属性。

例 07_key,监测 KEY0(难度简单)。项目路径为 Qt/3/07_key。
在源文件“mainwindow.h”的代码如下。

/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 07_key
* @brief mainwindow.h
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-04-19
*******************************************************************/
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 按下的状态。

在源文件“mainwindow.cpp”的代码如下

/******************************************************************
Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.
* @projectName 07_key
* @brief mainwindow.cpp
* @author Deng Zhimao
* @email 1252699831@qq.com
* @net www.openedv.com
* @date 2021-04-19
*******************************************************************/
1 #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()等哪个按键,就可以知道是哪个按键按下或者松开了。并设置了标签文本的属性。

三、程序运行效果

Ubuntu/Windows 上当焦点聚集到此应用程序窗口时,按下方向键“↓”,标签文本的值会改变为“Down 按键按下”,当松开方向键“↓”,标签的文本值会改变为默认状态“Down 按键松开”。

开发板上同理,按下 KEY0 键则会打印“VolumeDown 按键按下”,松开 KEY0 键会打印“VolumeDown 按键松开”。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值