1. 程式人生 > >嵌入式Linux Qt多個按鍵先後檢測的實現方法

嵌入式Linux Qt多個按鍵先後檢測的實現方法

QT的按鍵是基於事件進行觸發的。

    在產品開發中,假設我們要在APP的某個頁面中,同時按下多個按鍵進入工廠測試模式。又假設我們要寫一個魂鬥羅或者超級瑪麗的遊戲,我們需要按方向鍵讓小人走,按某個鍵跳或者射擊,這都需要先後檢測按鍵是否按下。

    我的實現方法如下:

    QT按鍵事件包含按下和彈起兩個事件,按下,相當於按鍵置位,彈起相當於按鍵清位,基於這樣的思想很快就可以用置位和清位的方式來實現了。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QKeyEvent>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void Get_key();
private:
    Ui::MainWindow *ui;
    quint32 Key_value ;
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent* event );
};

#endif // MAINWINDOW_H

     首先在QT上新建一個QT UI介面,在mainwindow.h中定義相關的處理函式和變數,其中quint32型別的Key_value表示最後獲取的鍵值,接下來看看Cpp檔案實現

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Key_value = false ;
    ui->label->clear();
}

MainWindow::~MainWindow()
{
    delete ui;
}

//按鍵按下
 void MainWindow::keyPressEvent(QKeyEvent *event)
 {
     if(event->key() == Qt::Key_Left)
         Key_value |= (1 << 0) ;
     else if(event->key() == Qt::Key_Right)
         Key_value |= (1 << 1) ;
     else if(event->key() == Qt::Key_Up)
         Key_value |= (1 << 2) ;
     else if(event->key() == Qt::Key_Down)
         Key_value |= (1 << 3) ;
     else if(event->key() == Qt::Key_Return)
         Key_value |= (1 << 4) ;
     Get_key();
     update();
 }

 //按鍵釋放
 void MainWindow::keyReleaseEvent( QKeyEvent* event )
 {
     if(event->key() == Qt::Key_Left )
         Key_value &= ~(1 << 0);
     else if(event->key() == Qt::Key_Right)
         Key_value &= ~(1 << 1) ;
     else if(event->key() == Qt::Key_Up)
         Key_value &= ~(1 << 2) ;
     else if(event->key() == Qt::Key_Down)
         Key_value &= ~(1 << 3) ;
     else if(event->key() == Qt::Key_Return)
         Key_value &= ~(1 << 4) ;
     ui->label->clear();
     update();
 }

 //獲取鍵值
 void MainWindow::Get_key()
 {
         switch(Key_value)
         {
            case 1:
                    ui->label->setText("左");
                    break ;
            case 2:
                    ui->label->setText("右");
                    break ;
            case 4:
                    ui->label->setText("上");
                    break ;
            case 8:
                    ui->label->setText("下");
                    break ;
            case 21:
                    ui->label->setText("左+上+回車");
                   break ;
         }
 }

    如cpp程式碼所示,當事件獲取到方向左鍵按下時,會自動呼叫keyPressEvent這個函式,此時Key_value |= (1 << 0),呼叫Get_key()函式即可獲取當前左鍵的鍵值為1,當釋放按鍵時會自動呼叫keyReleseEvent這個函式,此時Key_value = 0,依次類推,可以得到左右上下的值分別為1、2、4、8。

    當按下多個按鍵時,相當於多個位同時生效,假設按下左+上+回車鍵,此時鍵值即為21,但這樣的原理其實是先後對按鍵位的檢測,只不過系統執行速度比較快,人的感覺是同時按下而已。

    用這樣簡單的方法即可實現多個按鍵同時按下,對開發QT遊戲,嵌入式QT裝置是非常有用的。

執行結果,app執行後,當按下相應的鍵時,則會在label控制元件上顯示,本程式可持續拓展。