Qt能否同时捕获两个按键事件?

加盾男爵 2018-11-01 11:56:46
win7 + Qt5.9 +MingW

现在类似一个飞机游戏,打算用WSAD四个键控制飞机的运动,H键为飞机子弹

实际操作中WSAD这四个键需要支持按住不放(飞机持续移动),但在游戏的过程中,假如按住了A键,飞机在持续的左移,这个时候敲击了一下H键,这时候发现飞机停了

使用qDebug()打印发现,按住A时程序一直在执行按键事件

if(event->key() == Qt::Key_A)
movePlane();


但按了一次H键后,按键事件里执行了event->key() == Qt::Key_H的相关代码后,就不在继续执行按键A的代码了,而整个过程,我的按键A一直处于按住不放的状态?我想问下,这个问题在没解决?
...全文
1757 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yc_Blog 2018-11-15
  • 打赏
  • 举报
回复
我想问一下怎么判断按键的状态
连风 2018-11-08
  • 打赏
  • 举报
回复
同时捕捉键盘事件中多个按键是没有问题的,我做过类似的控制飞行的输入,其中一种方式就是键盘输入,同时可以多个按键控制飞行姿态
弓人水 2018-11-04
  • 打赏
  • 举报
回复 3
简单写个例子:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

const int REPEAT_RATE = 300;

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
repeatTimer(new QTimer(this))
{
ui->setupUi(this);
connect(repeatTimer, SIGNAL(timeout()), SLOT(onRepeatTimer()));
}

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

void MainWindow::keyPressEvent(QKeyEvent *event)
{
pressedKeys.append(static_cast<Qt::Key>(event->key()));
if(!repeatTimer->isActive()) {
repeatTimer->start(REPEAT_RATE); // 重复间隔 REPEAT_RATE = 300 毫秒
}
}

void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
if(repeatTimer->isActive() && pressedKeys.isEmpty()) {
repeatTimer->stop();
onRepeatTimer();
}
pressedKeys.removeAll(static_cast<Qt::Key>(event->key()));
}

void MainWindow::onRepeatTimer()
{
if(pressedKeys.contains(Qt::Key_W)) {
qDebug() << tr("向上移动");
}
if(pressedKeys.contains(Qt::Key_S)) {
qDebug() << tr("向下移动");
}
if(pressedKeys.contains(Qt::Key_A)) {
qDebug() << tr("向左移动");
}
if(pressedKeys.contains(Qt::Key_D)) {
qDebug() << tr("向右移动");
}
if(pressedKeys.contains(Qt::Key_H)) {
qDebug() << tr("发射子弹");
}
}

弓人水 2018-11-04
  • 打赏
  • 举报
回复 1
Qt的按键事件有两个:按下(QEvent::KeyPress)和抬起(QEvent::KeyRelease)。
再描述一下多个按键同时按下的事件状态:当一个按键被按下后,会连续触发按下和抬起事件,但是这时候,再按下其他按键后,前一个按键停止连续触发,并处于按下的事件状态,新按下的按键会连续触发按下和抬起事件(依次类推,不论多少个按键按下都是一样的)。
所以,要根据上面的情况进行多按键同时按下的处理设计:加一个定时器,有按键按下时,开始定时器,所有按键抬起时停止定时器(抬起时也处理一次操作)。单个按键按下时,基本上定时器用不到,都是抬起事件处理操作,但是新按键按下后,定时器就会起到作用了。
注意:定时器的开始和停止要判断所有按键的状态。
  • 打赏
  • 举报
回复
https://forum.qt.io/topic/28327/big-issue-with-qt-key-inputs-for-gaming

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧