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