【问题标题】:Qt multiple keys pressed at onceQt同时按下多个键
【发布时间】:2017-10-26 08:29:44
【问题描述】:

我目前正在使用 Qt C++ 开发一个小型 2D 游戏。
在开始开发之前,我只是在尝试一些小事情。游戏。

问题是我不能同时按下 3 个以上的键。
我需要这个,因为我想在同一台 PC 和同一键盘上与 2 到 4 名玩家一起玩。
如果我找不到解决方案,我的玩家将无法同时玩游戏,这是个问题,因为它是实时游戏。

我正在使用基本的 keyPressEvent 来捕捉按键。
然后我将键存储在 QMap(int, bool) 中,以了解女巫键被按下和未按下。
我还使用计时器来处理 QMap 值并在按下一个或多个键时执行一些操作。
问题是当按住 3 键时,我按下了第 4 键。
第4个键没有catch,实际上程序不再调用keyPressEvent。

我的代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtWidgets>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private:
    QTimer *timer;
    QMap<int, bool> keys;
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *e);

private slots:
    void timerOutEvent();
};

#endif // WIDGET_H

Widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    timer = new QTimer();
    timer->setInterval(1000/60);
    timer->start();

    connect(timer, &QTimer::timeout, this, &Widget::timerOutEvent);
}

Widget::~Widget()
{

}

void Widget::timerOutEvent()
{
    QString txt = "";

    if(keys[Qt::Key_Up])
    {
        txt += "u";
    }
    if(keys[Qt::Key_Down])
    {
        txt += "d";
    }
    if(keys[Qt::Key_Left])
    {
        txt += "l";
    }
    if(keys[Qt::Key_Right])
    {
        txt += "r";
    }

    qDebug() << txt;
}

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    keys[event->key()] = false;
    QWidget::keyReleaseEvent(event);
}

void Widget::keyPressEvent(QKeyEvent *event)
{
    keys[event->key()] = true;
    QWidget::keyPressEvent(event);
}

ma​​in.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

提前感谢您的帮助!
亚历克斯

【问题讨论】:

  • 不是答案,但如果您确实想开发游戏,请查看 V-Play。这是 Qt 的游戏引擎:v-play.net
  • 我会检查,但我不喜欢使用引擎。如果存在其他解决方案,那将是完美的。

标签: c++ qt


【解决方案1】:

好的,我刚刚明白了一些事情。

键盘不是一大堆键。键盘由按键组组成。

我解释一下:

  1. 您不能同时按下以下四个键:上下左右按钮。

  2. 但是,例如,您可以同时按下以下键:a w shift ctrl up right plus and enter。它有 8 个键。

因此可以得出结论,键盘是一种多组键。

感谢您的帮助,希望这篇文章对某人有所帮助:)
亚历克斯

【讨论】:

    【解决方案2】:

    这是一个硬件限制,你永远不需要同时使用 5 个按键,那为什么制造商会检测到 4 个以上,一些扩展键盘管理超过 3-4 个按键,另一种方法是插入 2 个同一台计算机上的键盘或至少 2 个 Xbox/PS 控制器。

    使用我的键盘“Microsoft 有线键盘 600”,我至少可以使用默认布局中的 4 个键和小键盘中的 2 个键,您可以在应用程序中使用小键盘。

    【讨论】:

    • 请问?我的编辑器使用 ctrl-alt-shift-[ 折叠选择。那是四个同时键。
    • @MartinBonner 这取决于具体的键。相信我。当我还是个孩子的时候,我们曾经玩过分屏游戏。您必须以不会干扰太多的方式绑定键。
    • 我尝试在 Word 2016 上一次按 4 个以上的键,它起作用了......所以我推断这不是硬件限制......以及所有其他你可以玩的游戏超过一次 4 个键... 是的,我需要同时按下 5 个以上的键,因为我的游戏是 2-4 人游戏。我希望不止一个玩家可以移动!
    • @AlexanderWohlfahrtalex0k36 我只是尝试在 World 2016 上按超过 4 个键,但我的键盘对我不起作用
    • @AlexanderWohlfahrtalex0k36 键盘 USB HID 默认限制为最多 6 个键 en.wikipedia.org/wiki/… 您可以尝试安装键盘驱动程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多