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 开发人员已经有一段时间忽略修复了。
肯
我正在尝试让游戏手柄功能在我的 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 开发人员已经有一段时间忽略修复了。 肯