当前位置: 首页 > news >正文

Qt5支持手柄

背景

使用Qt5的Gamepad模块支持手柄UI显示和操作。Qt使用的版本是5.15.8。采用的是SDL支持的插件。因为想要支持PS5手柄,但是使用默认的xinputgamepad.dll好像对PS5手柄的支持不太好。

编译和构建

SDL2选用github上官方SDL2项目的最新release包即可

  • 需要工作在VS命令行工具。
  • 需要Qt源码

找到qtsoucecodepath\qtgamepad\src\plugins\gamepads\sdl2目录,该目录下有对应的源码

nmake.exe" -f Makefile.Debug all
nmake 
nmake install

Release也行,改一下就好
产物在plugins\gamepads目录下

使用

使用时也放在可执行文件目录的plugins\gamepads文件夹下就可以,gamepadsplatforms同级,SDL2库文件放在可执行文件目录就好。

如果gamepads目录下有xinputgamepad.dll文件可能会优先选择,但是如果gamepads目录下只有sdl2gamepad.dll的话,就只能选择sdl支持了。

踩坑

Qt5 Gamepad模块无法拿到手柄的详细信息,比如手柄的类型(可以通过vendor id做简单类型区分,也可以通过product id做具体手柄区分)。业务场景是要求区分各个厂家的手柄并做对应的按键UI。所以仅靠Qt5 Gamepad是不够的。所以还需要依靠SDL的能力,要将Gamepad和SDL的GameController连接起来。(原来我以为Qt Gamepad的device id和SDL GameController intex不是同一个值,采用了一种特别别扭的映射方法)

通过阅读SDL插件和Qt Gamepad部分的代码,发现其实SDL GameController的index其实是通过信号传递给了Qt5的Gamepad.

void QSdlGamepadBackend::addController(int index)
{char GUID[100];SDL_JoystickGetGUIDString(SDL_JoystickGetDeviceGUID(index), GUID, 100);if (!SDL_IsGameController(index))return;SDL_GameController *controller = SDL_GameControllerOpen(index);if (controller) {m_indexForController.insert(index, controller);SDL_Joystick *joystick = SDL_GameControllerGetJoystick(controller);int instanceID = SDL_JoystickInstanceID(joystick);m_instanceIdForIndex.insert(instanceID, index);const char *name = SDL_JoystickName(joystick);//qDebug() << "Controller " << index << " added with instanceId: " << instanceID;emit gamepadAdded(index);if (name)emit gamepadNamed(index, QString::fromUtf8(name));}
}

gamepadAdded信号把index丢给了Qt上层
Qt则是用这个index当做devciceId了,那说明Qt Gamepad和SDL GameController其实是可以通过这个deviceId链接起来的,那么问题就简单多了。

void QGamepadManagerPrivate::_q_forwardGamepadConnected(int deviceId)
{Q_Q(QGamepadManager);connectedGamepads.insert(deviceId, QString());emit q->gamepadConnected(deviceId);emit q->connectedGamepadsChanged();
}

只需要维护一个Qt Gamepad到手柄类型的Map映射即可,当Qt的QGamepadManager收到connectedGamepadsChanged信号时,构造一个QGamepad对象,然后通过Gamepad的deviceId去SDL拿到vendor id。

    QGamepadManager* manager = QGamepadManager::instance();QList<int> gamepadList = manager->connectedGamepads();SPDLOG_INFO("Connected gamepad count: {}", gamepadList.size());for (const auto& device_id : gamepadList) {SPDLOG_INFO("Connected gamepad deviceId: {}", device_id);QGamepad* gamepad = new QGamepad(device_id, this);if (gamepad != nullptr) {Uint16 vendor = SDL_JoystickGetDeviceVendor(device_id);// handle gamepad reflect} else {continue;}}

关于Qt6

Gamepad好像目前还没有移植到Qt6,需要找一下其他的替代方案了,可以考虑直接引入SDL,但是不知道会不会和Qt有事件冲突

http://www.zskr.cn/news/54093.html

相关文章:

  • 2025 年 11 月表面处理厂家推荐排行榜,表面处理氮化,刀具/模具/零部件/模具钢/Td/钨钢表面处理,等离子金属/真空镀铬/耐磨/金属喷涂公司推荐
  • 拓扑 AC 2025 线上 NOIP 联测 #4
  • 2025 年 11 月真空镀膜厂家推荐排行榜,氮化锆/碳化铬/碳氮化铬/类金刚石/PVD/磁控溅射/纳米镀膜,不锈钢镀膜/模具真空镀膜/金属表面镀膜公司精选
  • kubernetes中的pod管理 - 实践
  • 2025年11月中国数据库流行度排行榜:OB 稳占榜首席,三甲鏖战正当时
  • 2025年AI自习室加盟/代理推荐:AI自习室加盟风险与选择建议
  • 2025年11月大厂求职机构推荐榜单与权威选择指南
  • 2025年11月大厂求职机构推荐:权威榜单与选择指南
  • 基于MATLAB实现AlexNet模型训练
  • Redis在CentOS7上的自启动配置
  • 第一次Block作业:电梯调度分析
  • 百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二) - 详解
  • 2025年11月人才盘点公司推荐榜单:头部企业与高成长公司优选指南
  • 2025年11月四川考公机构推荐榜单:五家知名机构综合对比分析
  • 2025年11月不锈钢精密铸造厂家排行指南:从资质到服务的深度评测
  • 2025年11月不锈钢精密铸造厂家评价与排名深度解析
  • linux deepin安装
  • 山东欧太亚塑业有限公司联系方式:背景介绍与联络方式解析
  • 2025年多功能造香机源头厂家权威推荐榜单:小型制香机/线香制香机/多功能手工造香机设备厂家精选
  • 树的基础算法(二)二叉树
  • 2025 年 11 月悬浮炉厂家权威推荐榜:真空悬浮熔炼炉,50kg/30kg/15kg/5kg真空感应悬浮炉专业选购指南
  • 2025 年 11 月真空电弧炉厂家推荐排行榜,真空自耗电弧炉,2.5t/4t/7t真空自耗电弧炉,真空电极自耗电弧,真空电弧炉熔炼设备厂家推荐
  • 2025 年 11 月悬浮炉厂家推荐排行榜,真空悬浮炉,50kg悬浮炉,30kg真空感应悬浮炉,15kg/5kg悬浮熔炼炉公司精选
  • 文献综述模板详解:快速掌握撰写技巧与格式规范
  • 在vite.config.ts中配置proxy后台api代理实现前台开发环境与后台生产环境对接
  • 本土开发者如何选择代码托管平台?
  • ECMWF数值天气预报的现状和发展
  • 电脑黑屏(无视频输出信号)
  • 深圳公司招聘后端开发工程师
  • git多代码仓库合并的方式