嵌入式 Linux 设备上的输入
在您的嵌入式 Linux 设备上,若未安装窗口系统,则可通过 `evdev ` 直接读取鼠标、键盘和触摸输入,或使用辅助库(如libinput 或tslib )。但此行为要求用户能够读取设备节点/dev/input/event* 。eglfs 和linuxfb 已将所有输入处理代码编译其中。
使用 libinput
libinput是一个用于处理输入设备的库,可作为 Qt 自身evdev 输入支持的替代方案。若要启用libinput ,在配置和构建 Qt 时,请确保libudev 和libinput 的开发文件可用。 若需要键盘支持,则还需xkbcommon 。若已安装eglfs 和linuxfb ,则无需采取其他操作,因为这些插件默认使用libinput 。如果libinput 支持不可用,或者设置了QT_QPA_EGLFS_NO_LIBINPUT 环境变量,则将改用Qt自带的evdev 处理程序。
当通过libinput 接收输入事件时,可使用以下环境变量:
| 变量 | 描述 |
|---|---|
QT_QPA_LIBINPUT_TOUCH_MATRIX | 指定要应用的 3x3 变换矩阵的前两行。这些值应以空格分隔。详情请参阅libinput 文档。 |
未使用 libinput 时的 eglfs 和 linuxfb 输入
设备节点名等参数可通过QT_QPA_EVDEV_MOUSE_PARAMETERS 、QT_QPA_EVDEV_KEYBOARD_PARAMETERS 和QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS 环境变量进行设置;各条目之间请用冒号分隔。这些参数是替代在-plugin 命令行参数中传递设置的另一种方式,对于某些后端而言,它们是必不可少的。但eglfs 和linuxfb 使用内置输入处理程序,因此不使用单独的-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 在配置时启用了libudev 支持,则支持在应用程序运行时连接或断开输入设备(热插拔)。此时,在 configure 阶段,sysroot 中将包含libudev 开发头文件。
evdev 鼠标处理程序支持以下额外参数:
| 参数 | 描述 |
|---|---|
/dev/input/... | 指定输入设备的名称。如果未指定,Qt 会通过libudev 或遍历可用节点来查找合适的设备。 |
nocompress | 默认情况下,与上一次 Qt 鼠标事件相比未导致位置变化的输入事件会被压缩。只有在位置或按钮状态发生变化后,才会发送新的 Qt 鼠标事件。若要禁用此行为,请设置nocompress 参数。 |
dejitter | 指定抖动限制;默认禁用。 |
grab | 当设置为 `1` 时,Qt 将独占该设备。 |
abs | 某些触摸屏报告绝对坐标,且无法与触摸板区分开来。在这种情况下,请传递abs 以指示该设备使用绝对事件。 |
键盘
evdev 键盘处理程序支持以下额外参数:
| 参数 | 描述 |
|---|---|
/dev/input/... | 指定输入设备的名称。如果未指定,Qt 将通过 `libudev ` 或遍历可用节点来查找合适的设备。 |
grab | 启用输入设备的抓取功能。 |
disable-zap | 禁用 zap 键组合。请参阅下文关于Ctrl+Alt+Backspace 的说明。 |
keymap | 指定自定义键盘映射文件的名称。 |
enable-compose | 启用合成。 |
repeat-delay | 设置自定义按键重复延迟。 |
repeat-rate | 设置自定义按键重复间隔。 |
在未禁用终端会话的嵌入式 Linux 系统上,按键行为可能会令人困惑,因为输入事件由 Qt 应用程序和 tty 共同处理。为解决此问题,可使用以下选项:
- 在应用程序启动时,
EGLFS和LinuxFB会尝试通过将tty的键盘模式设置为K_OFF来禁用终端键盘。这可防止按键事件被发送至终端。若需要标准行为,请将环境变量QT_QPA_ENABLE_TERMINAL_KEYBOARD设置为1。请注意,此方法仅在通过ssh等命令从远程控制台启动应用程序且终端键盘输入保持启用时有效。 - 另一种方法是利用
evdev键盘处理程序的grab参数,在QT_QPA_EVDEV_KEYBOARD_PARAMETERS中传入grab=1。这将尝试获取输入设备的控制权。如果grab成功,只要Qt应用程序仍在运行,系统中的其他组件就不会收到该输入设备的事件。 这种方法更适合远程启动的应用程序,因为它无需访问 tty 设备。 - 最后,对于许多专门的嵌入式 Linux 镜像而言,从一开始启用标准终端会话本身就没有意义。 有关如何禁用这些终端会话的更多详细信息,请参阅您的构建环境文档。例如,在使用Yocto Project 生成镜像时,取消设置 `
SYSVINIT_ENABLED_GETTYS` 会导致没有 `getty` 进程运行。这意味着,任何虚拟终端上都不会有输入。
如果默认的内置键位映射不足以满足需求,您可以通过keymap 参数指定其他键位映射。
注意: 与eglfs 的其他配置文件一样, 这些旧版键位映射文件被视为受信任内容,完全由设备或平台创建者控制和管理。它们不应暴露给设备的最终用户,也不应允许加载用户提供的键位映射文件。
警告:使用 内置键位映射时 ,zap组合键(Ctrl+Alt+Backspace )会退出应用程序。该组合键由键盘处理程序捕获,因此应用程序不会收到相关通知,也无法阻止其执行。在任何类似键盘的输入设备都可能关闭用户界面的设备上,请在QT_QPA_EVDEV_KEYBOARD_PARAMETERS 中传入disable-zap 。
注意:控制台 切换(Ctrl+Alt+Fx )和重启组合键会被键盘处理程序识别,但不会被执行,因此实际上会被忽略。
要生成自定义键位映射,请使用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 事件。
注意:设备 选择和过滤完全交由tslib 处理。这意味着 tslib 自身的配置文件决定哪些过滤器模块会被加载到应用程序进程中;Qt 既不选择也不枚举这些模块。对于新设备,建议优先使用libinput 。
evdev 的触摸处理程序支持以下额外参数:
| 参数 | 描述 |
|---|---|
/dev/input/... | 指定输入设备的名称。如果未指定,Qt 将通过libudev 或遍历可用节点来查找合适的设备。 |
rotate | 在某些触摸屏上,必须通过将 `rotate ` 设置为 90、180 或 270 来旋转坐标。 |
invertx 以及inverty | 指定用于反转输入事件中 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 )将某些信息打印到调试输出中。这有助于检测当前正在使用的设备,或排查设备发现问题。
若需对输入子系统(鼠标、键盘、触摸)进行更详细的日志记录,请通过以下方式启用所有与输入相关的日志类别:
export QT_LOGGING_RULES="qt.qpa.input.*=true;qt.qpa.events=true"使用自定义鼠标光标图像
eglfs 自带一组 32x32 尺寸的鼠标光标图像。如果这些不足以满足需求,您可以通过将环境变量 `QT_QPA_EGLFS_CURSOR ` 设置为 JSON 文件的名称来提供自定义光标图集。该文件还可以通过Qt 资源系统嵌入到应用程序中。
例如,一个每行包含 8 张光标图像的嵌入式光标图集可按如下方式指定:
{
"image": ":/cursor-atlas.png",
"cursorsPerRow": 8,
"hotSpots": [
[7, 2],
[12, 3],
[12, 12],
...
]
}请注意,图像应在图集中紧密排列;光标的宽度和高度将根据图像总大小以及cursorsPerRow 设置来确定。图集还必须为所有受支持的光标提供相应的图像。
注意: 与eglfs 的其他配置文件一样, 光标图集被视为受信任的内容,由设备或平台创建者完全控制和管理。该内容不应向设备的最终用户公开。
image 和hotSpots 键以及非零的cursorsPerRow 均为必填项,且hotSpots 必须为每个受支持的光标形状包含一个条目。若文件缺少上述任何一项,将被拒绝并伴随警告,且该光标将被禁用。
© 2026 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.