针对这个问题,可以考虑以下几种方案来应对 Qt 在热插拔后无法正确响应触摸屏的问题:
1. 使用 udev 规则创建持久的设备名称
由于热插拔后系统给设备分配的设备节点(例如 /dev/input/event1 或 /dev/input/event2)可能会发生变化,而 Qt 应用程序中如果直接指定了某个设备节点,就会导致重新挂载后失效。解决办法是通过编写 udev 规则,为触摸屏创建设备符号链接(例如 /dev/input/touchscreen),保证无论设备实际挂载到哪个节点,应用程序都能通过同一符号链接访问。例如,在 /etc/udev/rules.d/99-touchscreen.rules 中添加如下规则:
ini复制编辑SUBSYSTEM=="input", ATTRS{name}=="<你的触摸屏名称>", SYMLINK+="input/touchscreen"
然后在 Qt 配置中使用固定的 /dev/input/touchscreen 节点。这样,即使设备实际挂载到不同的 event 号上,也能保持应用程序对设备的访问路径一致。
2. 监听 udev 事件并动态重载输入设备
如果你的应用程序需要在设备丢失后自动恢复触摸功能,可以在应用中增加对 udev 事件的监听。通过 libudev 等库监控 /sys/class/input 下设备的变化,当检测到触摸屏被重新挂载时,主动调用相应的接口重新初始化或加载触摸屏驱动。这样可以在设备热插拔时让 Qt 应用自动更新设备句柄,而不需要重启整个应用程序。
3. 修改或扩展 Qt 的输入插件(如 evdevtouch)
Qt 默认的 evdev 或 evdevtouch 输入插件对热插拔的支持可能较弱,可以考虑修改其源码,加入设备丢失后的重扫描逻辑。也就是说,在插件内部检测到输入设备断开时,能够自动搜索并重新绑定新挂载的触摸屏设备。这种方法需要对 Qt 源码及其输入驱动有一定了解,但从根本上解决了热插拔时驱动无法自动恢复的问题。