嵌入式 Linux 设备上的输入

在嵌入式 Linux 设备上,当没有窗口系统时,可通过evdev 或使用libinputtslib 等辅助库直接读取鼠标、键盘和触摸输入。不过,这种行为要求设备节点/dev/input/event* 可被用户读取。eglfslinuxfb 已编译了所有输入处理代码。

使用 libinput

libinput是一个处理输入设备的库,它为 Qt XML 自身的evdev 输入支持提供了一个替代方案。要启用libinput ,请在配置和构建 Qt 时确保libudevlibinput 的开发文件可用。如果您需要键盘支持,那么xkbcommon 也是必要的。对于eglfslinuxfb ,无需进一步操作,因为这些插件默认使用libinput 。如果libinput 支持不可用或设置了QT_QPA_EGLFS_NO_LIBINPUT 环境变量,则会使用 Qt XML 自带的evdev 处理程序来代替。

不使用 libinput 在 eglfs 和 linuxfb 上输入内容

设备节点名称等参数可在QT_QPA_EVDEV_MOUSE_PARAMETERSQT_QPA_EVDEV_KEYBOARD_PARAMETERSQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS 环境变量中设置;条目之间用冒号分隔。这些参数是在-plugin 命令行参数中传递设置的替代方法,对于某些后端,它们是必不可少的。但eglfslinuxfb 使用内置输入处理程序,因此没有单独的-plugin 参数。

此外,可以通过将QT_QPA_EGLFS_DISABLE_INPUT (用于eglfs )或QT_QPA_FB_DISABLE_INPUT (用于linuxfb )设置为1 来禁用内置输入处理程序。

鼠标

只要未设置QT_QPA_EGLFS_HIDECURSOR (用于eglfs )或QT_QPA_FB_HIDECURSOR (用于linuxfb ),且 Qt 基于 libudev 的设备发现报告称至少有一个鼠标可用,鼠标光标就会显示出来。不支持libudev 时,鼠标光标始终显示;除非通过环境变量明确禁用。

如果 Qt XML 配置了libudev 支持,则支持在应用程序运行时连接或断开输入设备(热插拔)。那么在配置时,libudev 开发头文件就会出现在 sysroot 中。

evdev 鼠标处理程序支持以下额外参数:

参数参数
/dev/input/...指定输入设备的名称。如果未指定,Qt 会通过libudev 或遍历可用节点来查找合适的设备。
nocompress默认情况下,与上一个 Qt Positioning 鼠标事件相比,不会导致位置改变的输入事件会被压缩。只有在位置或按钮状态发生变化后,才会发送新的 Qt Positioning 鼠标事件。要禁用此行为,请设置nocompress 参数。
dejitter指定抖动限制;默认为禁用。
grab当设置为1 时,Qt 会抓取设备专用。
abs有些触摸屏报告的是绝对坐标,无法与触摸板区分开来。在这种情况下,通过abs 表示设备使用绝对事件。

键盘

evdev 键盘处理程序支持以下额外参数:

参数参数
/dev/input/...指定输入设备的名称。如果未指定,Qt 会通过libudev 或遍历可用节点查找合适的设备。
grab启用抓取输入设备。
keymap指定自定义键盘映射文件的名称。
enable-compose启用合成。
repeat-delay设置自定义按键重复延迟。
repeat-rate设置自定义按键重复率。

在未禁用终端会话的嵌入式 Linux 系统上,按键行为可能会令人困惑,因为 Qt 应用程序和 tty 都会处理输入事件。为克服这一问题,我们提供了以下选项:

  • 在应用程序启动时,EGLFSLinuxFB 会尝试禁用终端键盘,将 tty 的键盘模式设置为K_OFF 。这将阻止键盘输入到终端。如果需要标准行为,可将QT_QPA_ENABLE_TERMINAL_KEYBOARD 环境变量设置为1 。请注意,只有当应用程序从远程控制台启动(例如通过ssh )时才会起作用,而且终端键盘输入仍会启用。
  • 另一种方法是通过在QT_QPA_EVDEV_KEYBOARD_PARAMETERS 中传递grab=1 来使用evdev 键盘处理程序的grab 参数。这样做的结果是尝试抓取输入设备。如果grab 成功,只要 Qt 应用程序还在运行,系统中的其他组件就不会从中接收事件。这种方法更适合远程启动的应用程序,因为它不需要访问 tty 设备。
  • 最后,对于许多专业的嵌入式 Linux 映像来说,首先启用标准终端会话是没有意义的。有关如何禁用这些终端会话的详细信息,请参阅构建环境的文档。例如,在使用Yocto 项目生成映像时,取消SYSVINIT_ENABLED_GETTYS 会导致getty 进程无法运行。这意味着任何虚拟终端上都没有输入。

如果默认的内置键表不够用,可以通过keymap 参数指定不同的键表。

注意: 目前不支持特殊的系统组合键,如控制台切换键 (Ctrl+Alt+Fx) 或 zap 键 (Ctrl+Alt+Backspace) ,这些组合键将被忽略。

要生成自定义按键映射,请使用kmap2qmap 工具,该工具可在qttools 模块中找到。源文件必须是标准的 Linuxkmap 格式,内核的loadkeys 命令可以理解这种格式。qmap 文件可以通过以下方式之一生成:

  • Linux 控制台工具(LCT)项目。
  • X.orgX11 键映射可通过ckbcomp 实用程序转换为kmap 格式。
  • 由于kmap 文件是纯文本文件,因此也可以手工制作。

kmap2qmap 这是一个命令行程序,至少需要 2 个文件作为参数。最后一个参数是生成的 文件,其他所有参数都将作为输入 文件进行解析。例如.qmap .kmap

kmap2qmap i386/qwertz/de-latin1-nodeadkeys.kmap include/compose.latin1.inc de-latin1-nodeadkeys.qmap

注意: kmap2qmap 并不支持 Linux 内核支持的所有(伪)符号。因此,在转换标准键表时,会出现一些关于Show_Registers,Hex_A 等的警告;这些信息可以忽略。

触摸

虽然对于现代触摸屏来说这并不是必要的,但一些仅支持单点触摸的旧式电阻触摸屏可能会要求你重新使用tslib ,而不是依赖 Linux 多点触摸协议和事件设备。

要启用tslib 支持,请将QT_QPA_EGLFS_TSLIB (用于eglfs )或QT_QPA_FB_TSLIB (用于linuxfb )环境变量设为 1。要更改设备,请设置TSLIB_TSDEVICE 环境变量或在命令行中传递设备名称。请注意,tslib 输入处理程序生成鼠标事件,仅支持单点触控,而evdevtouch 则生成真正的多点触控QTouchEvent 事件。

evdev 触摸处理程序支持以下额外参数:

参数参数
/dev/input/...指定输入设备的名称。如果未指定,Qt 会通过libudev 或遍历可用节点来查找合适的设备。
rotate在某些触摸屏上,必须通过将rotate 设置为 90、180 或 270 来旋转坐标。
invertxinverty指定参数以反转输入事件中的 X 或 Y 坐标。

例如,如果在启动应用程序前向QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS 传递以下值,就可以明确指定坐标翻转的触摸设备。当实际屏幕的方向与触摸屏的方向不一致时,这就很有用了。

export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180

基于笔的平板电脑

evdevtablet 插件为 Wacom 和类似的笔式平板电脑提供基本支持。它仅生成QTabletEvent 事件。要启用该插件,请在环境中输入QT_QPA_GENERIC_PLUGINS=evdevtablet ,或者在命令行中输入-plugin evdevtablet 参数。

如果 Qt 的自动设备发现功能(基于libudev 或遍历/dev/input/event* )无法正常运行或出现异常,该插件可以接受一个设备节点参数,如QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1

调试输入设备

通过启用qt.qpa.input 日志规则(例如将QT_LOGGING_RULES 环境变量设置为qt.qpa.input=true ),可以将某些信息打印到调试输出中。这对于检测正在使用的设备或排除设备发现问题非常有用。

使用自定义鼠标光标图像

eglfs 在 Windows XP 中,鼠标指针会自带一组 32x32 大小的鼠标指针图像。如果这些图像不够用,可以通过将 环境变量设置为 JSON 文件名来提供自定义光标图集。该文件也可以通过QT_QPA_EGLFS_CURSOR Qt 资源系统嵌入到应用程序中。

例如,嵌入式游标图集每行包含 8 幅游标图像,具体方法如下:

{
  "image": ":/cursor-atlas.png",
  "cursorsPerRow": 8,
  "hotSpots": [
      [7, 2],
      [12, 3],
      [12, 12],
      ...
  ]
}

请注意,图集中的图像应紧密排列;游标的宽度和高度根据总图像大小和cursorsPerRow 设置来确定。地图集还必须为所有支持的光标提供图像。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.