嵌入式Linux Qt多个按键先后检测的实现方法

2019-07-13 06:54发布

QT的按键是基于事件进行触发的。     在产品开发中,假设我们要在APP的某个页面中,同时按下多个按键进入工厂测试模式。又假设我们要写一个魂斗罗或者超级玛丽的游戏,我们需要按方向键让小人走,按某个键跳或者射击,这都需要先后检测按键是否按下。     我的实现方法如下:     QT按键事件包含按下和弹起两个事件,按下,相当于按键置位,弹起相当于按键清位,基于这样的思想很快就可以用置位和清位的方式来实现了。   #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include 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控件上显示,本程序可持续拓展。 程序源码下载:https://download.csdn.net/download/morixinguan/10780232