正点原子 发表于 2021-7-20 11:50:22

《I.MX6U嵌入式Qt开发指南》第二十一章 USER-KEY

本帖最后由 正点原子 于 2021-8-11 12:25 编辑

1)实验平台:正点原子i.MX6ULL Linux阿尔法开发板
2)章节摘自【正点原子】《I.MX6U嵌入式Qt开发指南》
3)购买链接:https://item.taobao.com/item.htm?&id=603672744434
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子Linux技术交流群:1027879335








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

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


21.2 应用实例
       想要监测这个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         <a href="mailto:1252699831@qq.com" target="_blank">1252699831@qq.com</a>
    * @net            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
    * @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
10class MainWindow : public QMainWindow
11{
12      Q_OBJECT
13
14public:
15      MainWindow(QWidget *parent = nullptr);
16      ~MainWindow();
17
18private:
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         <a href="mailto:1252699831@qq.com" target="_blank">1252699831@qq.com</a>
    * @net            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
    * @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
42MainWindow::~MainWindow()
43{
44}
45
46void 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
66void 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()等哪个按键,就可以知道是哪个按键按下或者松开了。并设置了标签文本的属性。
21.3 程序运行效果
       Ubuntu/Windows上当焦点聚集到此应用程序窗口时,按下方向键“↓”,标签文本的值会改变为“Down按键按下”,当松开方向键“↓”,标签的文本值会改变为默认状态“Down按键松开”。
       开发板上同理,按下KEY0键则会打印“VolumeDown按键按下”,松开KEY0键会打印“VolumeDown按键松开”。

chenkai_ck_ 发表于 2021-7-23 21:08:21

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}
页: [1]
查看完整版本: 《I.MX6U嵌入式Qt开发指南》第二十一章 USER-KEY