基于Qt Linux开发板USER-KEY按键实现

415 阅读6分钟

介绍如何在 Qt 应用上使用嵌入式 GET6818 Linux 开发板

上的按键。

工具:Qt Creator 5.14.2 平台:windows

## 资源简介

在GET6818 开发板,开发板板载资源上有两个用户按键。如下图原理图(下图开发板的按键原理图)。

转存失败,建议直接上传图片文件 ## 应用实例

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

我们在本例中使用 Key_Down(键盘方向键↓)在 Windows/Ubuntu 上测试,在开发板上还是使用 KEY0 按键测试。在开发板监测这个 KEY0 有很多方法。比如使用 C 语言开一个线程监测这个按键,或者按本例重写键盘事件来监测 KEY0 按键按下或者松开。

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

## .pro

QT       += core gui
​
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
​
CONFIG += c++11
​
DEFINES += QT_DEPRECATED_WARNINGS
​
SOURCES += \
    main.cpp \
    mainwindow.cpp
​
HEADERS += \
    mainwindow.h
​
FORMS += \
    mainwindow.ui
​
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

## mainwindow.h

声明需要重写的按键事件类型。分别是按下事件和松开事件。通过重写这两个事件可以监测到键盘或 KEY0 按下的状态。


    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H#include <QMainWindow>#include <QKeyEvent> //键盘事件
    #include <QLabel>
    #include <QDebug>
    #include <QEvent>   // 事件基类
    ​
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    ​
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    ​
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    ​
    private:
        Ui::MainWindow *ui;
    ​
        /* 标签文本 */
        QLabel *label;
    ​
        /* 重写按键事件 */
        void keyPressEvent(QKeyEvent *event);
        void keyReleaseEvent(QKeyEvent *event);
    };
    #endif // MAINWINDOW_H

## mainwindow.cpp

界面初始化设置,在嵌入式里,根据实际的屏的大小,设置全屏显示。按

钮居中显示。重写按下事件和松开事件,通过判断 event->key() 等哪个按键,就可以知道是哪个按键按下或者松开了。并设置了标签文本的属性。

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QGuiApplication> // 界面应用
#include <QScreen>  // 屏幕
#include <QRect>    // 矩形
​
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("公众号:Qt历险记 查看更多好文");
    this->setStyleSheet("background:black;");
​
    /* 获取屏幕的分辨率,Qt 官方建议使用这
     * 种方法获取屏幕分辨率,防上多屏设备导致对应不上
     * 注意,这是获取整个桌面系统的分辨率
     */
    QList <QScreen *> list_screen = QGuiApplication::screens();
​
    /* 如果是 ARM 平台,直接设置大小为屏幕的大小 */
    #if __arm__
    /* 重设大小 */
    this->resize(list_screen.at(0)->geometry().width(),
    list_screen.at(0)->geometry().height());
    #else
    /* 否则则设置主窗体大小为 800x480 */
    this->setGeometry(0, 0, 800, 480);
    #endif/* 标签实例化 */
    label = new QLabel(this);
    label->setStyleSheet("color:green;");
    QFont  font = label->font();
    font.setBold(true);
    font.setPointSize(50);
    label->setFont(font);
​
    /* 设置默认文本 */
    #if __arm__
    label->setText("VolumeDown 松开状态");
    #else
    label->setText("Down 按键松开");
    #endif/* 设置对齐方式 */
    label->setAlignment(Qt::AlignCenter);
​
    /* 居中显示 */
    setCentralWidget(label);
}
​
MainWindow::~MainWindow()
{
    delete ui;
}
​
// 按压事件
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    #if __arm__
     /* 判断按下的按键,也就是板子 KEY0 按键 */
     if(event->key() == Qt::Key_VolumeDown) {
         /* 设置 label 的文本 */
         label->setText("VolumeDown 按键按下");
     }
     #else
     /* 判断按下的按键,也就是"↓"方向键 */
     if (event->key() == Qt::Key_Down) {
         /* 设置 label 的文本 */
         label->setText("Down 按键按下");
     }
​
     #endif
     /* 保存默认事件 */
     QWidget::keyPressEvent(event);
}
// 松开事件
void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
    #if __arm__
    /* 判断松开的按键,也就是板子 KEY0 按键 */
    if(event->key() == Qt::Key_VolumeDown) {
        /* 设置 label 的文本 */
        label->setText("VolumeDown 按键松开");
    }
    #else
    /* 判断按下的按键,也就是"↓"方向键 */
    if(event->key() == Qt::Key_Down) {
        /* 设置 label 的文本 */
        label->setText("Down 按键松开");
    }
    #endif
    /* 保存默认事件 */
    QWidget::keyReleaseEvent(event);
}
​
​

程序运行效果

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

注意在GEC6818 上运行测试此程序时,需要指定环境变量,指定键盘事件输入为事件 event1,event1 为按键事件。在GEC6818出厂系统上一般 event0 是触摸屏事件,event1 是为按键事件。导出下面的环境变量后,再在开发板运行此程序。

export QT_QPA_GENERIC_PLUGINS=evdevkeyboard:/dev/input/event1

同理在开发板上,按下 KEY0 键则会打印“VolumeDown 按键按下”,松开 KEY0 键会打印“VolumeDown 按键松开”。


知识拓展

QKeyEvent

QKeyEvent是一个在Qt框架下使用的类,用于处理键盘事件。Qt是一个流行的C++跨平台应用程序开发框架,它提供了丰富的功能和工具,用于开发图形用户界面(GUI)应用程序。

QKeyEvent类是Qt中处理键盘事件的重要组成部分之一。它包含了与键盘事件相关的信息,如按下的键码、键的状态(是否按下或释放)以及修饰键的状态(如Shift、Ctrl等)。通过使用QKeyEvent,你可以捕获和处理键盘事件,并根据需要执行相应的操作。

在Qt中,你可以通过重写QWidget、QMainWindow或其他相关类中的虚拟函数来处理键盘事件。当用户在应用程序窗口中按下或释放键盘上的键时,Qt会生成相应的QKeyEvent对象,并将其发送到活动窗口的事件处理器。

使用QKeyEvent,你可以获取按下的键码,并根据需要执行相应的逻辑。例如,你可以检测特定键的按下,比如Enter键或方向键,并在按下这些键时执行相应的操作,如提交表单或移动光标。

QEvent

QEvent是Qt框架中的一个基类,用于处理事件。事件是在应用程序中发生的各种动作或状态变化的表示,例如鼠标点击、键盘输入、窗口重绘等。QEvent提供了一种统一的方式来管理和处理这些事件。

作为一个基类,QEvent定义了事件的通用接口和属性。它包含了一个事件类型(Event Type),用于标识不同类型的事件,以及一些公共方法和属性,用于获取和操作事件的信息。在Qt中,许多类都派生自QEvent,并定义了特定的事件类型和额外的属性和方法。

QKeyEvent是QEvent的一个派生类,用于处理键盘事件。除了QKeyEvent,Qt还提供了许多其他派生类,用于处理不同类型的事件,如QMouseEvent(鼠标事件)、QResizeEvent(窗口尺寸调整事件)等。

通过使用QEvent和其派生类,你可以捕获和处理各种事件,并根据需要执行相应的操作。在处理键盘事件时,你可以使用QKeyEvent来获取按下的键码和键的状态,并根据这些信息执行相应的逻辑。

总之,QEvent是Qt框架中用于处理事件的基类,而QKeyEvent是其派生类之一,专门用于处理键盘事件。通过使用这些类,你可以方便地管理和处理应用程序中发生的各种事件,为用户提供更好的交互体验。