所以,现在 3 个月后,我认为我和我的团队刚刚为这个问题想出了一个可行的解决方案。
解决方案的路径始于“使用 libinput”上的 Qt Documentation。该文档归结为一些重要的陈述:
设备节点名称等参数可以在环境变量QT_QPA_EVDEV_MOUSE_PARAMETERS、QT_QPA_EVDEV_KEYBOARD_PARAMETERS和QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS中设置
只要没有设置 QT_QPA_EGLFS_HIDECURSOR(对于 eglfs)或 QT_QPA_FB_HIDECURSOR(对于 linuxfb)并且 Qt 的基于 libudev 的设备发现报告至少有一个鼠标可用,鼠标光标就会出现。当不存在 libudev 支持时,鼠标光标始终显示,除非通过环境变量明确禁用。
evdevtablet 插件为 Wacom 和类似的基于笔的数位板提供基本支持。它只生成 QTabletEvent 事件。要启用它,请在环境中传递 QT_QPA_GENERIC_PLUGINS=evdevtablet ,或者在命令行中传递 -plugin evdevtablet 参数。该插件可以采用设备节点参数,例如 QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1,以防 Qt 的自动设备发现(基于 libudev 或 /dev/input/event* 的演练)不起作用或行为异常。
所以,在我的系统中,我有设备节点:event0、event1、event2、event3、 event4、event5、mice 和 mouse0。因为我试图让 mouse 工作,所以我假设我必须使用 mouse0 节点。这导致我设置这些环境变量:
QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/mouse0
让我很沮丧的是,这些环境变量什么也没导致。一段时间后,我和我的团队想出了如何在我们的系统上从 Qt 源代码获取调试输出:
- 修改我们 yocto build 下 qtbase 目录下的源代码(大致 /yocto/poky/build/tmp/work/temp build directory/qtbase
- 将 qtbase/plugins/generic/libqevdevmouseplugin.so 复制到我的硬件(大致 /usr/lib/qt5/plugins/generic)
- 从命令行运行 Qt
我们很快发现来自 mouse0 和 mice 的输入事件基本上是垃圾数据。在我们的系统上,我们确实在内核中设置了 EVDEV,因此鼠标输入也与设备节点 event0 相关联。当我们尝试将 Qt 鼠标参数设置为 event0 时,我们开始看到看起来像真实数据的调试输出。
QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
但是,没有鼠标指针的问题仍然存在。过了一会儿,我们回顾了 Qt 文档,特别是上面列出的第二段。作为最后一次尝试,我们尝试添加 QT_QPA_FB_HIDECURSOR 环境变量...
QT_QPA_GENERIC_PLUGINS=evdevmouse
QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
QT_QPA_FB_HIDECURSOR=0
还有……瞧!经过无数小时的调试和阅读文档,我们终于得到了鼠标指针。
我认为我们问题的主要症结在于误解了 Qt 文档。
鼠标光标出现在... QT_QPA_FB_HIDECURSOR (for linuxfb) is not set
通过“未设置”,Qt 意味着明确定义为 FALSE...而不是简单地“未设置”。
这个解决方案对我们有用,但它确实至少还有一件事有待改进。一路上,我偶然发现了this thread answer on the Unix StackEx,它指向input/input.txt 的内核文档。在“3.2.2 mousedev”部分中,您可以看到以下行:
每个“鼠标”设备都分配给一个鼠标或数字化仪,除了
最后一个 - '老鼠'。这个单字符设备由所有人共享
鼠标和数字化仪,即使没有连接,该设备也是
展示。这对于热插拔 USB 鼠标很有用,因此程序
即使没有鼠标也可以打开设备。
这对我们来说意味着虽然我们可以使用 event0(当我们拔掉鼠标时它会消失)来处理我们的鼠标输入事件,但如果没有,我们将无法支持热插拔进行一些内核/Qt 源代码修改或弄清楚如何让 mice 作为 Qt 鼠标输入参数工作。
所以,“为什么 event0 起作用而不是 mouse0/mice”的问题仍然存在......但现在我们'我们有一个可以接受的解决方案。
更新:稍后我们发现 udev 在我们的系统上无法正常工作。我们在 Yocto 构建的包组中添加了 udev 到 RDEPENDS,现在我们可以设置
QT_QPA_GENERIC_PLUGINS=evdevmouse
我们得到了一个支持热插拔的工作鼠标指针。