#qt ## 应用 QShortCut方式的快捷键有好几种使用方式: 1.通过绑定[QAction](https://so.csdn.net/so/search?q=QAction&spm=1001.2101.3001.7020)或QMenu的方式。QAction和QMenu都提供了setShortcut()接口; 2.实例化一个对象:然后绑定信号槽[activated](https://so.csdn.net/so/search?q=activated&spm=1001.2101.3001.7020)()信号: ``` cpp 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():是实际匹配快捷键的算法函数,通过函数回调方式解耦; ![[Pasted image 20240806155009.png]] ![[Pasted image 20240806155015.png]] ### 处理消息相关代码 ![[Pasted image 20240806155025.png]] 核心函数调用链: tryShortcut() => nextState() => find() => dispatchEvent() 尝试调用快捷键 => 状态机查询匹配 => 查找快捷键 =>分发事件(通过CoreApplication::sendEvent) 注意事项 使用QShortCut方式需要注意的是如果采用动态嵌入窗口(dock)的方式组成你的界面,两个界面尽量不要注册相同的快捷键,不然会出现独立窗口时可用,嵌入子窗口会出现快捷键冲突报错;原因在于嵌入后QShortCut 通过全局shortcupMap判断的activeWindow是同一个顶部窗口; 这时候倒不如直接通过keyEvent触发组合键盘事件即可。