CEF3 系列 -- 实践汇总(持续更新)
前言
首次半年绩效考核,挺好的绩效。输出一些技术相关的汇总, 比如:Cef。
- 20 年 7 月,应届入职。博主首次接触 Web 相关开发:Electron & VueJS 桌面客户端。
- 22 年 11 月,博主入职新公司,并再次接触 Web 相关的开发:Qt & QCefView 桌面客户端。
正文
汇总主要关注应用开发中的技术问题、技术 ‘难点’ 。因此,后续部分将以列表形式给出。
1、Input Method Editor (IME)
2、QCefView 输入法组合键:小语种(葡萄牙语)
KeyBoardUtils 作为插件的辅助工具,主要用于 Qt 事件 –> CEF3 事件的参数转换。其中的 winGetKeyBoardModifiers
接口,负责解析虚拟组合按键。
- 问题代码段首先,从代码风格可见 QCefView 作者具备深厚的 Window 开发功底。问题代码意图:
1
2
3
4
5
6
7
8
9
10
11
12
13static uint32_t
winGetKeyboardModifiers(QKeyEvent* qe){
...
if(!qe->text().isEmpty() && (::GetKeyState(VK_RMENU) & 0x8000)){
HKL current_layout = ::GetKeyBoardLayout(0);
SHORT scan_res = ::VkKeyScanExW(vk, current_layout);
if(((scan_res >> 8) & 0xFF) == (2 | 4)){
cm &= ~(EVENTFLAG_CONTROL_DOWN | EVENTFLAG_ALT_DOWN);
cm |= EVENTFLAG_ALTGR_DOWN
}
}
return cm;
}- 判断小语种键盘:
::GetKeyState(VK_RMENU) & 0x8000
- 获取键盘布局:
::GetKeyBoardLayout(0)
- 通过 VirtualKey 和 物理键盘布局获取扫描码:
VkKeyScanExW(vk, current_layout)
- 匹配 Control + ALT 组合键:位运算见上述代码。
- 判断小语种键盘:
- 修复代码段OSR 渲染模式下,我们无法获取正确的窗口句柄及其 Window 消息。所以,上述操作有点多此一举:只需要匹配 CONTROL + ALT 即可。
1
2
3
4
5
6
7
8
9
10
11static uint32_t
winGetKeyboardModifiers(QKeyEvent* qe){
...
if(!qe->text().isEmpty()){
if((m & Qt::ControlModifier) && (m & Qt::ALtModifier)){
cm &= ~(EVENTFLAG_CONTROL_DOWN | EVENTFLAG_ALT_DOWN);
cm |= EVENTFLAG_ALTGR_DOWN
}
}
return cm;
}
3、QCefView Hover Event: HoverIn & HoverOut
CEF3 三种鼠标事件 :cef_browser_capi
- send_mouse_click_event: 处理鼠标点击
- send_mouse_move_event:处理鼠标移动
- send_mouse_wheel_event:处理鼠标滚轮
Qt 鼠标事件 :
- mouseMoveEvent: 鼠标移动
- mousePressEvent:鼠标按下
- mouseReleaseEvent:鼠标释放
- wheelEvent:鼠标滚轮
- enterEvent & leaveEvent: 鼠标移入 & 移出
问题描述 :
QCefView 插件完美适配了 Qt 的前四种事件,即:mouseMove、mousePress、mouseRelease、wheelEvent。通过字面义,可以很清晰地将 CEF3 和 QCefView 事件映射。 然而,enterEvent
和 leaveEvent
并没有找到合适的选择。当窗口边缘属于可滚动区域时,边缘的滚动条的交互效果会出现 Bug: 缺少 HoverIn、HoverOut 效果。
问题解决 :
通过测试,CEF3 的 send_mouse_move_event 接口兼具 moveMouse、mouseEnter 和 mouseLeave 的功能。因此,只需要按照 QCefView 接口规范,补充并转发 Qt 对应的 enterEvent 和 leaveEvent 即可。
CEF3 系列 -- 实践汇总(持续更新)
https://jalencui.com/2023/09/02/CEF-Pratice-Summary/