嵌入式Linux EGLFS环境下从/dev/input/event1捕获QKeyEvent问题咨询
解决Qt 5.14 EGLFS平台无法捕获键盘QKeyEvent的方案
你当前配置的冲突根源是QT_QPA_EGLFS_DISABLE_INPUT = 1环境变量,它会直接关闭EGLFS平台插件的所有输入事件分发逻辑,所以只能拿到底层socket通知的SockAct事件,无法转换为上层的QKeyEvent。
第一步:修正环境变量配置
删除错误的QT_QPA_EGLFS_DISABLE_INPUT配置,其余变量按如下规则调整:
- Linux下环境变量参数分隔符使用冒号
:而非分号;,QT_QPA_EVDEV_KEYBOARD_PARAMETERS的正确写法为:QT_QPA_EVDEV_KEYBOARD_PARAMETERS=/dev/input/event1:grab=1 - 完整的环境变量配置清单:
export QT_QPA_PLATFORM=eglfs export QT_QPA_GENERIC_PLUGINS=evdevkeyboard,evdevmouse export QT_QPA_EVDEV_KEYBOARD_PARAMETERS=/dev/input/event1:grab=1
第二步:验证设备访问权限
确保运行Qt应用的用户对/dev/input/event1有读权限,可通过如下命令临时赋权测试:chmod 666 /dev/input/event1
正式环境建议通过udev规则配置输入设备的访问权限,避免全局开放权限。
第三步:排查插件加载状态
添加环境变量QT_LOGGING_RULES=qt.qpa.input=true开启输入模块日志,运行应用时查看evdev键盘插件是否正常加载、是否正确识别/dev/input/event1设备。如果是自定义非标准键盘,可通过QT_QPA_EVDEV_KEYBOARD_MAP环境变量指定自定义的键盘映射表路径。
第四步:验证事件过滤器写法
全局键盘事件需要安装到应用实例上才能捕获,参考示例:
bool YourEventFilter::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); // 自定义按键处理逻辑 return true; } return QObject::eventFilter(obj, event); } // 安装全局过滤器 qApp->installEventFilter(new YourEventFilter);
内容的提问来源于stack exchange,提问作者Chandana
相关产品推荐
相关产品推荐

