嵌入式Linux Qt多個按鍵先後檢測的實現方法
阿新 • • 發佈:2019-01-10
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控制元件上顯示,本程式可持續拓展。