嵌入式Linux为Qt定制keymap

5 篇文章 0 订阅

嵌入式Linux很多场景下需要自行制定Keyboard的keycode. 对于某个按键F8, Qt::Key_F8是Qt api, 是个固定值, 用于Qt application统一读取使用, 而缺省Linux把keycode映射为:

//src/plugins/generic/bsdkeyboard/qbsdkeyboard_defaultmap.h
const QBsdKeyboardMap::Mapping keymapDefault[] = {
    {  66, 0xffff, Qt::Key_F8,                  ModPlain,                        NoFlags, 0x0000 },
}
//qnamespace.h
Key_F8 = 0x01000037,

而嵌入式平台按键有限且要自行指定keycode, 这时不再使用上述keymapDefault的缺省实现. 比如将输入设备gpio keys实现为驱动 /dev/input/event1 (假如他的F8 keycode是82, 非66), 那么如何让Qt使用 /dev/input/event1 并使用新的 keycode--Key_F8 映射关系呢?

有以下几个步骤:

1. 使用qtapp/utilities/kmap2qmap工具将xxx.kmap(可编辑)生成xxx.qmap(二进制文件), xxx.kmap 内容可以是:

keymaps 0-127
...
#headset
keycode 82 = F8
...

2. 在启动Qt application前, 指定环境变量 QT_QPA_EVDEV_KEYBOARD_PARAMETERS, 其中包含了所使用的设备驱动/dev/input/event1 以及所定制的按键映射 xxx.qmap.  此外, 指定环境变量QT_QPA_EGLFS_NO_LIBINPUT 表示禁用 libinput 而使用 Qt 自带的 evdev handler用于接收并处理输入事件:

export QT_QPA_EVDEV_KEYBOARD_PARAMETERS=/dev/input/event0:/dev/input/event1:/dev/input/event2:/dev/input/event3:keymap=/usr/mbin/xxx.qmap
export QT_QPA_EGLFS_NO_LIBINPUT=1

3. 在Qt application的code中(比如qml)就可以使用通用的Qt::Key_F8了:

Item {
    anchors.fill: parent
    focus: true
    Keys.onPressed: {
        if (event.key >= Qt.Key_0 && event.key <= Qt.Key_9) {
            console.log("digit key");
            event.accepted = true;
        }
    }
    Keys.onReleased: {
        if (event.key == Qt.Key_F8) {
            console.log("headset key");
            event.accepted = true;
        } else {
            console.log("key=" + event.key);
        }
    }
}

参考: https://doc.qt.io/qt-6/inputs-linux-device.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值