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控件上显示,本程序可持续拓展。

3f288ee285423cc6e29fa526842ca321.png

程序源码下载:https://download.csdn.net/download/morixinguan/10780232

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐