嵌入式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 的 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
),并且基于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处理。为了克服这一问题,以下选项可用
- 在应用程序启动时,
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
参数指定一个不同的映射。
注意:目前不支持特定的系统键组合,例如控制台切换(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_Registers
、Hex_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 以旋转坐标。 |
invertx 和 inverty | 指定输入事件中翻转 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公司的商标。所有其他商标均为其各自所有者的财产。