此文档说明可以说是涵盖了绝大部分的键盘配置以及修改的问题,如果我一开始就看这,根本没必要走那么多弯路。~~~~(>_<)~~~~ 记得自己找不到某个功能接口,还要每个源码文件看一遍。 总共20w行,为此我还对比了一下公司的代码。噢,才18w行,那没事了。 看得头晕属实
之前是以前开篇时的想法。常言说,人一时一个样,总是改改变变。以前想着天天做虚拟键盘,看源码,觉得头晕脑胀,睡觉眼皮都在跳,觉得没学到什么。现在回想之前了,天天加android的需求,改之前留下的shit;又改c#,杂乱无章,上面总是说的同一句话,这跟“C”差不多;我也不得不接。现在觉得还是以前学得多啊。最后的现在,这项目最后也不是我接手了,也不归我管控,全看上级安排了,因为按公司的环境上这个还有很长的路,我一个人也推不动,也就放了。原本想理清一下源码,以后不知道还写不写
目录
相关链接:
使用文档说明及函数说明 (二)部署指南 deployment-guide
使用文档说明及函数说明 (三)手写支持 Handwriting
文件:\qtvirtualkeyboard-5.13\src\virtualkeyboard\doc\srctechnical-guide.qdoc
搜索:Technical Guide
本文档提供Qt虚拟键盘插件的技术概述。
基本概念
Qt虚拟键盘项目是一个Qt 5输入上下文插件,它实现QPlatformInputContextPlugin和QPlatformInputContext接口。这些接口允许插件作为Qt 5应用程序的平台输入上下文插件使用。
插件本身提供了一个支持多种输入方法的输入框架,以及一个用于虚拟键盘的QML UI。输入框架通过插件接口是可扩展的,允许在运行时加载第三方输入法和键盘布局。
输入框架提供以下主要接口:
QVirtualKeyboardInputContext: 为虚拟键盘和其他输入组件提供上下文信息。充当底层文本输入组件的接口/场景。(用户与键盘的事件/状态交互)
QVirtualKeyboardInputEngine:公开一个API来集成用户输入事件(按键事件等),并充当输入方法的主机。(as a host)负责将输入事件路由(route或分配?)到输入方法(InputMethod)
QVirtualKeyboardAbstractInputMethod:基于c++的输入方法的基类型。输入法通常处理按键事件,但也可以处理鼠标和触摸输入事件。
InputMethod:基于qml的输入方法的基类。输入法通常处理按键事件,但也可以处理鼠标和触摸输入事件。并且允许您创建一个可分配给InputEngine的自定义输入方法。
QVirtualKeyboardExtensionPlugin:提供额外功能的虚拟键盘扩展插件接口。虚拟键盘在启动时加载所有的扩展插件。它搜索plugins/virtualkeyboard目录并匹配在插件中找到的元数据。如果有两个或多个具有相同名称的扩展插件,它将加载版本号最高的那个。
输入上下文
输入上下文由键盘和具体的输入法使用。InputContext是一个由QML托管的单例实例。应用程序不应该直接与输入上下文交互。(而是通过QVirtualKeyboardInputEngine)
上下文信息
输入上下文提供对来自应用程序的上下文信息的访问。这些信息包括但不限于:
InputContext::cursorPosition
InputContext::cursorRectangle
InputContext::inputMethodHints
InputContext::preeditText
InputContext::selectedText
InputContext::surroundingText
语言环境
受支持的地区列表由“layouts/*”(5.12目录:qtvirtualkeyboard-5.13\src\virtualkeyboard\content\layouts )中的地区特定布局目录指定。每个布局目录可以包含一个或多个布局,例如fi_FI/main.qml或symbols.qml(刚好没有symbols?其他有的有)。如果特定于区域设置的布局与fallback区域设置没有不同,那么可以使用占位符文件<Layout type>,为Layout添加fallback。这将指定可以使用fallback layout的虚拟键盘。
布局目录至少必须包含以下的文件:
dialpad.fallback
digits.fallback
main.fallback
numbers.fallback
symbols.fallback
应用程序可以通过更改默认语言环境来指定初始布局。然而,这需要在应用程序初始化和加载输入法插件之前完成。如果没有对默认语言环境进行任何更改,则使用当前系统语言环境。(更改默认的语言环境,这样就不必在每次重启软件/程序都是默认的英文)
键盘的设置匹配按如下顺序执行:
- layouts/ <语言> _ <国家>
- layouts/ <语言> _ *
- layouts/ en_GB
首先匹配完整的区域设置名称。如果没有找到完整的匹配,那么只匹配语言环境。如果没有找到部分匹配,则使用“en_GB”地区作为回退。
完成区域设置选择后,键盘更新输入区域设置和输入方向以匹配当前布局。应用程序可以通过QInputMethod接口接收这些信息。
在内部,当前的输入语言环境也被更新为QVirtualKeyboardInputEngine和当前的输入方法实例。
Input Engine(输入引擎)
输入引擎对象由InputContext拥有。与InputContext一样,只有一个QVirtualKeyboardInputEngine实例。输入引擎包含一些API函数,键盘使用这些函数将用户交互(例如按键和释放事件)映射到输入法。
例如,通过以下方法映射虚拟键盘键事件:
QVirtualKeyboardInputEngine: virtualKeyPress
QVirtualKeyboardInputEngine: virtualKeyRelease
上述方法用于集成虚拟键盘,因此方法名称中有“virtual”一词。这也意味着这些方法不适合映射物理击键。这是因为只有在释放键时才会执行实际操作。
如果在按键(Press)事件之前按键(Release)被中断,那么键盘将调用QVirtualKeyboardInputEngine::virtualKeyCancel方法。
Input Method(输入法)
输入法是按键处理程序的具体实现。它的主要功能是处理按键事件和维护用户输入的状态信息。它通过QVirtualKeyboardInputContext中预先编辑的文本或按键事件,与文本编辑器进行交互。
输入法实例可以通过多种方式创建,具体取决于用例:
- KeyboardLayout::inputMethod:键盘布局可以单独为这个键盘布局创建一个输入法实例。需要注意的是,当键盘布局改变时,这个实例将被销毁。因此,这种方法通常仅限于非常狭窄的用例。
- KeyboardLayout::createInputMethod():键盘布局可以动态创建一个输入法,该输入法可用于此布局,也可用于
shared layouts(例如,符号