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

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/zbw1185/article/details/82891023

用途

通过手柄与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

猜你喜欢

转载自blog.csdn.net/zbw1185/article/details/82891023