Qt之与游戏手柄的交互(一)

用途

通过手柄与Qt的通信,发送指令至远程设备,控制远程设备的运动。

手柄种类

市面上的游戏手柄也有多种种类,主流的是蓝牙手柄2.4g手柄usb手柄。2.4g手柄有的会识别出来是Xbox设备,有的识别出来是usb设备。
本文中的方法只支持Xbox手柄,使用其他手柄不会被Qt的手柄模块识别到,这里用的是淘宝销量第一的北通手柄,接收器接上电脑后会识别为Xbox360设备,如下图:
在这里插入图片描述
其它手柄可能会识别为下图的设备,不会被Qt手柄模块识别:
在这里插入图片描述
在这里插入图片描述

方法

通过探究,发现了两种Qt与游戏手柄通信的方法。

  • 方法一:使用Qt的QtGamepad模块,也就是本文中的方法,此方法非常简单易用。但是,此模块不支持蓝牙手柄和usb手柄。不过只要是Xbox手柄,按键的映射都统一,不会错乱。
  • 方法二:使用Windows的手柄模块的API。此方法可以支持上述的所有手柄,但是我这边测试了四个主流手柄,按键映射有三款都不一样,而且有两个是相同品牌的手柄按键映射也不一致,这样想要换手柄就比较麻烦,还要改映射。

按键映射:就是手柄实际按键对应手柄驱动(手柄模块)中的按键的对应关系。

按键

这里以北通阿修罗手柄为例,标识出了按键映射,如下图:
在这里插入图片描述

实现

  • 下面是用QML写的,官方的示例
    在这里插入图片描述
    主要代码(QML的文档中没有对Gamepad的介绍,可以参考Qt C++中的QGamepad进行开发):
Gamepad {
    id: gamepad
    //检测并连接设备
    deviceId: GamepadManager.connectedGamepads.length > 0 ? GamepadManager.connectedGamepads[0] : -1
    //获取手柄左摇杆的Y轴的值
    onAxisLeftYChanged: {
        console.log(gamepad.axisLeftY)
    }
}
  • 下面写了个C++的示例,测试按键的状态和键值
    在这里插入图片描述
    主要代码:
//连接设备
QGamepad *m_gamepad = new QGamepad(0, this);

...

//显示手柄按下的按键的名称
connect(m_gamepad, &QGamepad::buttonAChanged, this, [=](bool pressed){
    showCurrentBtnName(pressed, "buttonA");
});
connect(m_gamepad, &QGamepad::buttonBChanged, this, [=](bool pressed){
    showCurrentBtnName(pressed, "buttonB");
});

...

//显示摇杆的值
connect(m_gamepad, &QGamepad::buttonL2Changed, this, [=](double value){
    showBtnVaule(1, value);
});
connect(m_gamepad, &QGamepad::buttonR2Changed, this, [=](double value){
    showBtnVaule(2, value);
});

示例代码

https://download.csdn.net/download/zbw1185/10694488

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

画茧自缚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值