QGamePadManager connectedDevices 为空但 Windows 检测到游戏手柄

QGamePadManager connectedDevices empty but Windows detects gamepad

我正在尝试让游戏手柄功能在我的 C++ QT 街机游戏(是的 PacMan)克隆应用程序中工作。我现在正在 Windows 中编写和测试它(我无权访问 Linux 框,但最终我会满怀希望地在那里进行测试)。我的 GamePanel class 中有一个名为“initInput”的受保护方法,这是该方法的代码:

void GamePanel::initInput()
{
    QList<int> lstDevices = QGamepadManager::instance()->connectedGamepads();

    if(!lstDevices.isEmpty())
        setGamepad(new QGamepad(lstDevices[0], this));
}

void GamePanel::setGamepad(const QGamepad *ptrGamepad)
{
    if(mPtrGamepad != nullptr)
        delete mPtrGamepad;

    mPtrGamepad = const_cast<QGamepad *>(ptrGamepad);

    connect(mPtrGamepad, &QGamepad::buttonAChanged, this, &GamePanel::pacManAPressed);
    connect(mPtrGamepad, &QGamepad::buttonBChanged, this, &GamePanel::pacManBPressed);
    connect(mPtrGamepad, &QGamepad::buttonCenterChanged, this, &GamePanel::pacManCenterPressed);
    connect(mPtrGamepad, &QGamepad::buttonGuideChanged, this, &GamePanel::pacManGuidePressed);
    connect(mPtrGamepad, &QGamepad::buttonDownChanged, this, &GamePanel::pacManDownPressed);
    connect(mPtrGamepad, &QGamepad::buttonLeftChanged, this, &GamePanel::pacManLeftPressed);
    connect(mPtrGamepad, &QGamepad::buttonRightChanged, this, &GamePanel::pacManRightPressed);
    connect(mPtrGamepad, &QGamepad::buttonUpChanged, this, &GamePanel::pacManUpPressed);
    connect(mPtrGamepad, &QGamepad::buttonL1Changed, this, &GamePanel::pacManL1Pressed);
    connect(mPtrGamepad, &QGamepad::buttonL2Changed, this, &GamePanel::pacManL2Tilted);
    connect(mPtrGamepad, &QGamepad::buttonL3Changed, this, &GamePanel::pacManL3Pressed);
    connect(mPtrGamepad, &QGamepad::buttonR1Changed, this, &GamePanel::pacManR1Pressed);
    connect(mPtrGamepad, &QGamepad::buttonR2Changed, this, &GamePanel::pacManR2Tilted);
    connect(mPtrGamepad, &QGamepad::buttonR3Changed, this, &GamePanel::pacManR3Pressed);
    connect(mPtrGamepad, &QGamepad::axisLeftXChanged, this, &GamePanel::pacManAxisLeftXTilted);
    connect(mPtrGamepad, &QGamepad::axisLeftYChanged, this, &GamePanel::pacManAxisLeftYTilted);
    connect(mPtrGamepad, &QGamepad::axisRightXChanged, this, &GamePanel::pacManAxisRightXTilted);
    connect(mPtrGamepad, &QGamepad::axisRightYChanged, this, &GamePanel::pacManAxisRightYTilted);
}

lstDevices 最终为空。我实际上使用 qDebug() 将代码输入到输出中,它总是会打印出没有设备。然而 Settngs/Control 面板/设备和打印机中的 Windows 显示了我的“Gamepad F310”,我只是尝试用它玩我在 Steam 上的游戏并且成功了。我可能做错了什么?我是否需要进行更多调用来填充 connectedDevices 或其他东西?

事实证明,根据此站点,QGamepadManager 中存在一些错误: https://bugreports.qt.io/browse/QTBUG-61553?focusedCommentId=371230&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel

显然你必须先获取 Manager 的实例,然后 创建一个虚拟 window,显示它,然后删除它,然后执行 QApplication::processEvents( ) 然后你可以获得 connectedDevices - 正在进行某种初始化。显然,此错误不会出现在 Linux 构建中。这是我的 initInput 新代码:

QGamepadManager *ptrManager = QGamepadManager::instance();

/******************************
 * Workaround code so gamepads are detected
 *****************************/
QWindow *wnd = new QWindow();
wnd->show();
delete wnd;
qApp->processEvents();
/********************************
 * End workaround code
 ********************************/

QList<int> lstDevices = ptrManager->connectedGamepads();

if(!lstDevices.isEmpty())
    setGamepad(new QGamepad(lstDevices[0], this));

希望这个回答能对其他人有所帮助!如果您发现此 question/answer 后它有所改进并且不再需要解决方法,请随时发表评论并告诉我。

此修复不适用于连续升级到 Win 10,同样的问题。操纵杆被 win 10 识别,测试正常,但由于某种原因,QT 可执行文件在某些​​权限级别被阻止。 QT 开发人员已经有一段时间忽略修复了。 肯