Qt QShortCut 快捷键 原理、实现和应用

QShortcut通过全局shortcutmap管理快捷键,当键盘事件触发时,会检查并执行绑定的事件。匹配过程涉及窗口匹配和Qt::ShortcutContext判断。使用时需注意不同窗口间的快捷键冲突问题,尤其是在动态嵌入窗口中。
摘要由CSDN通过智能技术生成

应用

QShortCut方式的快捷键有好几种使用方式:
1.通过绑定QAction或QMenu的方式。QAction和QMenu都提供了setShortcut()接口;
2.实例化一个对象:然后绑定信号槽activated()信号:

auto shortcut = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")), parent); 
connect(shortcut,&QShortcut::activated ,this,[=](){});

原理

QShortCut通过一个全局shortcutmap进行管理,当触发键盘事件时,会先检查shortcutmap是否有对应快捷键,然后触发快捷键绑定的事件;再对键盘事件进行处理;

匹配函数:qWidgetShortcutContextMatcher();
匹配函数过程:
1.首先是获取当前活动的顶部窗口qApp->activeWindow(),与shorCut parent窗口所在的toplevelWindow所在窗口进行匹配,排除是否在当前窗口触发;
2.接着根据所设置的Qt::ShortcutContext来判断是以什么样的方式进行判断,默认是Qt::WindowShortcut

底层实现,相关代码

qWidgetShortcutContextMatcher():是实际匹配快捷键的算法函数,通过函数回调方式解耦;
在这里插入图片描述
在这里插入图片描述

处理消息相关代码

在这里插入图片描述

核心函数调用链:

tryShortcut() => nextState() => find() => dispatchEvent()
尝试调用快捷键 => 状态机查询匹配 => 查找快捷键 =>分发事件(通过CoreApplication::sendEvent)

注意事项

使用QShortCut方式需要注意的是如果采用动态嵌入窗口(dock)的方式组成你的界面,两个界面尽量不要注册相同的快捷键,不然会出现独立窗口时可用,嵌入子窗口会出现快捷键冲突报错;原因在于嵌入后QShortCut 通过全局shortcupMap判断的activeWindow是同一个顶部窗口;
这时候倒不如直接通过keyEvent触发组合键盘事件即可

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值