OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2642|回复: 0

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

[复制链接]

1061

主题

1072

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4407
金钱
4407
注册时间
2019-5-8
在线时间
1196 小时
发表于 2022-8-30 10:43:44 | 显示全部楼层 |阅读模式

1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U 嵌入式Qt开发指南》

3)购买链接:https://detail.tmall.com/item.htm?id=609033604451
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按键原理图)。
image002.jpg
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”的代码如下。
  1.    /******************************************************************

  2.     Copyright © Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.

  3.     * @projectName   07_key

  4.     * @brief         mainwindow.h

  5.     * [url=home.php?mod=space&uid=90321]@Author[/url]        Deng Zhimao

  6.     * [url=home.php?mod=space&uid=55957]@EMAIL[/url]         1252699831@qq.com

  7.     * [url=home.php?mod=space&uid=28414]@net[/url]            www.openedv.com

  8.     * @date           2021-04-19

  9.     *******************************************************************/

  10. 1   #ifndef MAINWINDOW_H

  11. 2   #define MAINWINDOW_H

  12. 3

  13. 4   #include <QMainWindow>

  14. 5   #include <QKeyEvent>

  15. 6   #include <QLabel>

  16. 7   #include <QDebug>

  17. 8   #include <QEvent>

  18. 9

  19. 10  class MainWindow : public QMainWindow

  20. 11  {

  21. 12      Q_OBJECT

  22. 13

  23. 14  public:

  24. 15      MainWindow(QWidget *parent = nullptr);

  25. 16      ~MainWindow();

  26. 17

  27. 18  private:

  28. 19      /* 标签文本 */

  29. 20      QLabel *label;

  30. 21

  31. 22      /* 重写按键事件 */

  32. 23      void keyPressEvent(QKeyEvent *event);

  33. 24      void keyReleaseEvent(QKeyEvent *event);

  34. 25  };

  35. 26

  36. 27  #endif // MAINWINDOW_H
复制代码

第23~24行,声明需要重写的按键事件类型。分别是按下事件和松开事件。通过重写这两个事件可以监测到键盘或KEY0按下的状态。
在源文件“mainwindow.cpp”的代码如下。
  1.   /******************************************************************

  2.     Copyright &#169; Deng Zhimao Co., Ltd. 1990-2021. All rights reserved.

  3.     * @projectName   07_key

  4.     * @brief         mainwindow.cpp

  5.     * @author        Deng Zhimao

  6.     * @email         1252699831@qq.com

  7.     * @net            www.openedv.com

  8.     * @date           2021-04-19

  9.     *******************************************************************/

  10. 1   #include "mainwindow.h"

  11. 2   #include <QGuiApplication>

  12. 3   #include <QScreen>

  13. 4   #include <QRect>

  14. 5

  15. 6   MainWindow::MainWindow(QWidget *parent)

  16. 7       : QMainWindow(parent)

  17. 8   {

  18. 9       /* 获取屏幕的分辨率,Qt官方建议使用这

  19. 10       * 种方法获取屏幕分辨率,防上多屏设备导致对应不上

  20. 11       * 注意,这是获取整个桌面系统的分辨率

  21. 12       */

  22. 13      QList <QScreen *> list_screen =  QGuiApplication::screens();

  23. 14

  24. 15      /* 如果是ARM平台,直接设置大小为屏幕的大小 */

  25. 16  #if __arm__

  26. 17      /* 重设大小 */

  27. 18      this->resize(list_screen.at(0)->geometry().width(),

  28. 19                   list_screen.at(0)->geometry().height());

  29. 20  #else

  30. 21      /* 否则则设置主窗体大小为800x480 */

  31. 22      this->setGeometry(0, 0, 800, 480);

  32. 23  #endif

  33. 24

  34. 25      /* 标签实例化 */

  35. 26      label = new QLabel(this);

  36. 27

  37. 28      /* 设置默认文本 */

  38. 29  #if __arm__

  39. 30      label->setText("VolumeDown松开状态");

  40. 31  #else

  41. 32      label->setText("Down按键松开");

  42. 33  #endif

  43. 34

  44. 35      /* 设置对齐方式 */

  45. 36      label->setAlignment(Qt::AlignCenter);

  46. 37

  47. 38      /* 居中显示 */

  48. 39      setCentralWidget(label);

  49. 40  }

  50. 41

  51. 42  MainWindow::~MainWindow()

  52. 43  {

  53. 44  }

  54. 45

  55. 46  void MainWindow::keyPressEvent(QKeyEvent *event)

  56. 47  {

  57. 48  #if __arm__

  58. 49      /* 判断按下的按键,也就是板子KEY0按键 */

  59. 50      if(event->key() == Qt::Key_VolumeDown) {

  60. 51          /* 设置label的文本 */

  61. 52          label->setText("VolumeDown按键按下");

  62. 53      }

  63. 54  #else

  64. 55      /* 判断按下的按键,也就是"↓"方向键 */

  65. 56      if(event->key() == Qt::Key_Down) {

  66. 57          /* 设置label的文本 */

  67. 58          label->setText("Down按键按下");

  68. 59      }

  69. 60

  70. 61  #endif

  71. 62      /* 保存默认事件 */

  72. 63      QWidget::keyPressEvent(event);

  73. 64  }

  74. 65

  75. 66  void MainWindow::keyReleaseEvent(QKeyEvent *event)

  76. 67  {

  77. 68  #if __arm__

  78. 69      /* 判断松开的按键,也就是板子KEY0按键 */

  79. 70      if(event->key() == Qt::Key_VolumeDown) {

  80. 71          /* 设置label的文本 */

  81. 72          label->setText("VolumeDown按键松开");

  82. 73      }

  83. 74  #else

  84. 75      /* 判断按下的按键,也就是"↓"方向键 */

  85. 76      if(event->key() == Qt::Key_Down) {

  86. 77          /* 设置label的文本 */

  87. 78          label->setText("Down按键松开");

  88. 79      }

  89. 80  #endif

  90. 81      /* 保存默认事件 */

  91. 82      QWidget::keyReleaseEvent(event);

  92. 83  }
复制代码
第9行~23行,界面初始化设置,在嵌入式里,根据实际的屏的大小,设置全屏显示。按钮居中显示。
       第46~83行,重写按下事件和松开事件,通过判断event->key()等哪个按键,就可以知道是哪个按键按下或者松开了。并设置了标签文本的属性。

21.3 程序运行效果
Ubuntu/Windows上当焦点聚集到此应用程序窗口时,按下方向键“↓”,标签文本的值会改变为“Down按键按下”,当松开方向键“↓”,标签的文本值会改变为默认状态“Down按键松开”。
同理在开发板上,按下KEY0键则会打印“VolumeDown按键按下”,松开KEY0键会打印“VolumeDown按键松开”。

image004.jpg

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 03:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表