QGamePadManager connectedDevices 为空,但 Windows 检测到游戏手柄
Posted
技术标签:
【中文标题】QGamePadManager connectedDevices 为空,但 Windows 检测到游戏手柄【英文标题】:QGamePadManager connectedDevices empty but Windows detects gamepad 【发布时间】:2020-07-01 02:10:58 【问题描述】:我正在尝试让游戏手柄功能在我的 C++ QT 街机游戏(是的 PacMan)克隆应用程序中工作。我现在正在 Windows 中编写和测试它(我无法访问 Linux 机器,但最终我也希望在那里进行测试)。我的 GamePanel 类中有一个名为“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() 输出,它总是会打印出没有设备。然而,设置/控制面板/设备和打印机中的 Windows 显示了我的“Gamepad F310”,我只是尝试用它玩我在 Steam 上拥有的游戏,它工作正常。我可能做错了什么?我是否需要进行更多调用来填充 connectedDevices 或其他内容?
【问题讨论】:
我完全知道,并且自从发布后将其更改为类级别指针。我只关心 1 个游戏手柄,所以我现在使用第一个游戏手柄 - 要点是它没有检测到任何设备,但 Windows 可以看到它,而我的其他 Steam 游戏也可以看到它。所以我想知道我是否在代码中做错了什么 - 使用局部变量是一个有争议的问题,因为它甚至没有迭代一次 - 它永远不会进入循环体,这会成为一个问题。 Scheff,我更新了我的问题以显示新代码,因为它自最初发布以来已更改 我看到了Qt Gamepad Simple Example。可能值得一试(只是为了确认是QGamepadManager
导致了问题)。
刚刚运行它并进入应用程序输出“没有找到任何连接的游戏手柄” - 再次尝试我之前测试过的 Steam 游戏,它响应游戏手柄。应用程序输出中也有一条关于 XInput 线程也在运行的消息。我认为这是因为调试模式。但不幸的是,正如我所怀疑的那样,它就是 QGameManager。我不了解底层的 QT-ish 代码(包含所有 Q_OBJECT 和宏等),无法构建 QGamepad pro 项目,或者我会尝试自己调试。
【参考方案1】:
因此,根据这个站点,QGamepadManager 中存在一些错误: https://bugreports.qt.io/browse/QTBUG-61553?focusedCommentId=371230&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel
显然你必须首先获取 Manager 的实例,然后创建一个虚拟窗口,显示它,然后删除它,然后执行 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));
我希望这个答案可以帮助别人!如果您发现由于此问题/答案和解决方法不再需要而改进了,请随时发表评论并告诉我。
【讨论】:
【参考方案2】:此修复不适用于 Win 10 的连续升级,同样的问题。 win 10 可以识别操纵杆,测试正常,但由于某种原因,QT 可执行文件在某些权限级别被阻止。 QT 开发人员已经忽略了一段时间的修复.. 肯
【讨论】:
请不要发布 cmets 作为答案,而是等待获得足够的声誉并以正确的方式发表评论 我实际上对至少在 5.15 版中创建虚拟窗口的建议没有任何问题。不过,我今天下午刚刚升级到 6.2,显然 QtGamePad 不再可用,但从 5.15 开始,它似乎仍然可以正常工作。我不知道为什么你的代码不起作用。以上是关于QGamePadManager connectedDevices 为空,但 Windows 检测到游戏手柄的主要内容,如果未能解决你的问题,请参考以下文章
io.on('connection',...) 与 io.sockets.on('connection',...)
HTTP 标头中的 Connection 和 Proxy-connection 有啥区别?
max_connections 与 max_used_connections --ERROR 1040: Too many connections