OpenEdv-开源电子网

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

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

[复制链接]

1118

主题

1129

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4672
金钱
4672
注册时间
2019-5-8
在线时间
1224 小时
发表于 2021-7-19 12:47:38 | 显示全部楼层 |阅读模式
1)实验平台:正点原子阿尔法Linux开发板
2)  章节摘自【正点原子】《I.MX6U嵌入式Qt开发指南 V1.0》
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 QQ群.png

原子哥.jpg

微信公众号.png



第二十一章 USER-KEY


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


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

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]         <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
  7.     * [url=home.php?mod=space&uid=28414]@net[/url]            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
  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         <a href="mailto:1252699831@qq.com">1252699831@qq.com</a>
  7.     * @net            <a href="www.openedv.com" target="_blank">www.openedv.com</a>
  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按键松开”。
第二十一章 USER4387.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 18:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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