嵌入式Linux设备上的输入

在您的嵌入式Linux设备上,当没有存在窗口系统时,鼠标、键盘和触摸输入可直接通过evdev或使用辅助库,如libinputtslib读取。但是,这种行为要求设备节点/dev/input/event*可供用户读取。eglfslinuxfb都内置了所有输入处理代码。

使用 libinput

libinput是一个用于处理输入设备的库,提供了对Qt自带的evdev输入支持的替代方案。要启用使用libinput,在配置和构建Qt时,确保提供了libudevlibinput的开发文件。如果需要键盘支持,那么还需要xkbcommon。对于eglfslinuxfb,无需采取进一步操作,因为这些插件默认使用libinput。如果libinput支持不可用或设置了QT_QPA_EGLFS_NO_LIBINPUT环境变量,则使用Qt自带的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),并且基于libudev的设备发现报告至少有一个鼠标可用,鼠标光标就会显示出来。当没有libudev支持时,总是显示鼠标光标;除非明确通过环境变量禁用。

如果Qt配置了libudev支持,则支持在应用程序运行时连接或断开输入设备(即热插拔)。然后,在配置时sysroot中存在libudev开发头文件。

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

参数描述
/dev/input/...指定输入设备名称。如果没有指定,Qt会通过libudev或遍历可用节点来查找合适的设备。
nocompress默认情况下,与之前的Qt鼠标事件相比没有改变位置的输入事件会被压缩。只有当位置或按钮状态改变时才会发送新的Qt鼠标事件。要禁用此行为,请设置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)且终端键盘输入保持开启时有效。
  • 另一种方法是使用evdev键盘处理程序的grab参数。在QT_QPA_EVDEV_KEYBOARD_PARAMETERS中通过传递grab=1来尝试获取输入设备的抓取。如果grab成功,只要Qt应用程序在运行,系统中的其他组件将不会接收到来自该设备的事件。这种方法更适合远程启动的应用程序,因为它不需要访问tty设备。
  • 最后,对于许多专门的嵌入式Linux映像,根本不需要在启动时启用标准终端会话。有关如何禁用这些终端会话的更多信息,请参阅构建环境的文档。例如,当使用Yocto Project生成映像时,取消设置SYSVINIT_ENABLED_GETTYS将导致没有getty进程运行。这意味着在任何虚拟终端上都没有输入。

如果默认的内置键盘映射不足够,您可以通过keymap参数指定一个不同的映射。

注意:目前不支持特定的系统键组合,例如控制台切换(Ctrl+Alt+Fn)或重置(Ctrl+Alt+回车),它们将被忽略。

要生成自定义键盘映射,请使用位于qttools模块中的kmap2qmap实用程序。源文件必须以标准Linux kmap格式提供,该格式由内核的loadkeys命令理解。qmap文件可以通过以下任一方式生成

  • Linux Console Tools (LCT)项目。
  • 可以使用ckbcomp实用程序将X.org X11键盘映射转换为kmap格式。
  • 由于 kmap 文件是纯文本文件,它们也可以是手工制作的。

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

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

注意: kmap2qmap 并不支持 Linux 内核支持的所有(伪)符号。因此,当您转换标准键盘映射时,会有关于 Show_RegistersHex_A 等的内容警告;可以忽略这些消息。

触碰

尽管对于现代触摸屏来说不是必需的,但一些只能支持单点触摸的较老电阻触摸屏可能需要您回退使用 tslib,而不是依赖于 Linux 多点触摸协议和事件设备。

要启用 tslib 支持,将 QT_QPA_EGLFS_TSLIB(对于 eglfs)或 QT_QPA_FB_TSLIB(对于 linuxfb)环境变量设置为 1。要更改设备,设置 TSLIB_TSDEVICE 环境变量或传递设备名称到命令行。请注意,与生成真实的多点触摸 QTouchEvent 事件的 evdevtouch 一样,tslib 输入处理器仅生成鼠标事件,并且仅支持单点触摸。

evdev 触摸处理器支持以下额外参数

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

例如,如果在启动应用程序之前将以下值传递给 QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS,您将获得一个具有翻转坐标的显式指定的触摸设备。当实际屏幕的朝向和触摸屏不匹配时,这非常有用。

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

基于笔的平板电脑

身份认证的插件提供对 Wacom 和类似笔式平板的基本支持。它仅生成 QTabletEvent 事件。启用它,请在环境或命令行上传递 QT_QPA_GENERIC_PLUGINS=evdevtablet。作为替代,也可以传递参数 -plugin evdevtablet

如果 Qt 的自动设备发现(基于 libudev 或遍历 /dev/input/event*)无法正常工作或表现不佳,则插件可以接受设备节点参数,例如 QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1。还可以通过 Qt 资源系统 将文件嵌入到应用程序中。

调试输入设备

通过启用手动规则 qt.qpa.input,可以将一些信息打印到调试输出中,例如,通过将环境变量 QT_LOGGING_RULES 设置为 qt.qpa.input=true。这有助于识别正在使用的设备或解决问题。

使用自定义鼠标光标图像

eglfs 自带一组 32x32 尺寸的鼠标光标图像。如果这些不够用,您可以通过设置 QT_QPA_EGLFS_CURSOR 环境变量到 JSON 文件的名称来提供自定义的光标图集。也可以通过 Qt 资源系统 将此文件嵌入到应用程序中。

例如,一行8个游标图像的嵌入式游标图集可以这样指定:

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

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

© 2024 Qt公司。本文档中的贡献文档的版权归各自所有者所有。本提供在此的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可的。Qt及其相关标志是芬兰和/或世界其他地区的Qt公司的商标。所有其他商标均为其各自所有者的财产。