一、前言

在嵌入式板子上由于没有系统层面的输入法支持,所以都绕不开一个问题,那就是在需要输入的UI软件中,必须提供一个输入法来进行输入,大概从Qt5.7开始官方提供了输入法的源码,作为插件的形式加入到Qt中,这里需要特别提示的是,该源码是gpl的,商业应用对这个比较不感冒,可能更愿意自己基于Qt来实现一个。用纯Qt写输入法,如果不涉及到中文输入,那还是非常简单的,只需要将按钮上的字符用键盘事件发给焦点的控件即可。如果需要中文输入,最简单的做法是通过查询字库数据库来获取当前拼音对应的汉字,然后模拟键盘事件发送给焦点控件,好处是代码简单思路简单,缺点是性能堪忧,字库体积大,查询效率低,需要全拼才能找到合适的词语。复杂点的做法就是用谷歌开源的输入法引擎,查阅Qt自己的输入法源码,也是用的那个引擎,new出类,然后调用里面的函数接口,会返回对应的汉字,性能非常好。

谷歌开源的输入法引擎是标准的C++写的,所以可以非常方便的支持Qt4到Qt6,就不会局限于只能Qt5.7以后,输入法面板自己编写自己控制,自由度高,同时还可以加入简体繁体切换,特殊字符面板切换。其实可以复用很多按钮,比如在特殊字符这块,特殊字符往往一个面板不够放,可能要至少3个面板才能涵盖大部分的特殊字符,所有专门放了个特殊字符的面板按钮集合,通过翻页切换特殊字符,将对应的特殊字符文本设置到对应的按钮上,按钮单击后,识别按钮上的文本,然后再模拟键盘事件发送给焦点的控件即可。根据此思路其实可以拓展成多国语言输入法,根据大致的观察,多国语言基本上就是一些类似特殊字符的文本,将那些文本作为数据插入到焦点控件即可。

二、功能特点

  1. 纯QWidget编写,原创输入法机制,没有任何第三方动态库的依赖。
  2. 支持各种Qt版本,包括Qt4、Qt5、Qt6及后续版本。
  3. 支持各种编译器,包括mingw、msvc、gcc、clang、wasm等。
  4. 支持各种目标平台,包括windows、linux、macos、android、嵌入式linux等。
  5. 支持任意控件输入,包括文本框、微调框、可编辑下拉框、表格行等,以及网页中的输入控件。
  6. 支持中文、英文、数字、繁体、特殊字符、字母大小写等输入,可以自由切换。
  7. 无需更改原有项目代码,不用任何额外代码,自动识别需要输入的控件,弹出输入法面板,不需要输入法代码写得到处都是。
  8. 使用极为方便,通过源码集成到对应项目,源码是一个pri组件,只要在项目的pro文件引入即可。
  9. 接口极其丰富,在众多输入应用场景中不断迭代完善至今。
  10. 界面清晰简洁,UI美观友好,高仿IOS输入法,非常适合触摸设备。
  11. 顶部单行文字面板和弹出多行多列文字面板选词,支持滑动选词。
  12. 具有词汇记忆功能,之前选中过的词语放到候选词最前面。
  13. 具有自由造词功能,可以直接打开词汇文件写入自定义词组,最高级别显示。
  14. 造词支持单个拼音多个汉字,自动调整优先级。
  15. 内置数字小键盘,在微调框这种只需要输入数字的地方,自动弹出数字小键盘,更美观。
  16. 可通过设置弱属性,控制是弹出全键盘的数字面板还是数字小键盘。
  17. 可设置回车后自动隐藏输入法面板还是要执行插入回车换行符。
  18. 可对部分不需要输入的输入框设置禁用输入法。
  19. 多版面字符页面,可以自行拓展各种字符展示,可用于多语言输入。
  20. 输入法面板尺寸自由设置,采用布局自适应任何分辨率,同时适用于一些小分辨率的设备。
  21. 输入法面板位置支持控件正下方/正上方、永远居中、底部拉伸填充等多种方式。
  22. 界面自适应屏幕大小,输入法弹出位置为控件底部时,当超过桌面右边或者底部时,自动调整位置。
  23. 支持Qt程序嵌入的浏览器中的网页中的文本框等控件的输入。
  24. 可以分别设置面板按键字体大小、候选词字体大小、图标尺寸、顶部高度等。
  25. 属性控制数字输入,例如需要文本框默认弹出的是数字面板,则设置代码 ui->lineEdit->setProperty("flag", "number")。
  26. 属性控制大写输入,例如需要文本框默认输入字母永远大写,则设置代码 ui->lineEdit->setProperty("upper", true)。
  27. 自由控制需要显示输入法和不需要显示输入法,当某些控件不需要弹出输入法,只需要对应不需要弹出输入法的控件设置属性noinput为真即可。例如ui->lineEdit->setProperty("noinput", true)。
  28. 实现了长按超过500毫秒重复执行按下的键的功能。例如长按退格键,不断删除。
  29. 支持单拼、全拼、模糊拼音输入,智能分页算法,可任意翻页查看汉字词组。
  30. 默认自带5种皮肤颜色,可通过代码设置皮肤样式,用户也可用QSS自定义皮肤。
  31. 谷歌内核的输入法引擎,品质保证,字库文件1MB,不依赖数据库,资源占用低效率极高。支持模糊拼音,比如nh=你好。
  32. 可选windows专有版本,支持外部程序输入,比如输入到记事本、QQ聊天窗口等。
  33. 可选硬键盘同步输入版本,外接实体键盘,类似搜狗输入法弹出小的候选词面板,可以快捷键切换输入法状态。
  34. 整个输入法核心代码行数1000行左右,非常小,不会对程序体积造成负担。
  35. 代码结构极为清晰,注释详细,非常容易阅读和理解,可自行修改和拓展满足各种需求。

三、代码使用

  1. 将core_input2019和core_pinyin整个目录放到你的项目的pro同一级别目录中。
  2. 在你的主程序的pro文件中加一行 include($$PWD/core_input2019/core_input2019.pri)
  3. 在你的程序的main函数中引入头文件 #include "core_input2019/frminput2019.h"
  4. 在你的程序的main函数中加几行代码。
QApplication a(argc, argv);
frmInput2019::Instance()->hide();
frmInput2019::Instance()->setFontInfo("MicroSoft Yahei", 18, 16);
frmInput2019::Instance()->setFixedSize2(650, 310);
frmInput2019::Instance()->setIconSize(26, 26);
frmInput2019::Instance()->setTopHeight(60);
QWidget w;
w.show();
return a.exec();
  1. 将源码下的inputfile文件夹下所有文件(即字库文件)复制到可执行文件同一目录。
  2. 详细的输入法函数接口使用参见main.cpp和frminputtool.cpp以及frmInput2019.h头文件中的接口,都有详细注释说明。

四、效果图



五、体验地址

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_input.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 视频主页:https://space.bilibili.com/687803542/

Qt/C++中英输入法/嵌入式输入法/小数字面板/简繁切换/特殊字符/支持Qt456的更多相关文章

  1. QT国际化(中英转换)

    转载:https://blog.csdn.net/u012528526/article/details/54707233 QT国际化(中英转换) 我们都知道在安卓中,想做国际化很简单,只需要建立对应的 ...

  2. 安装完Linux Mint后,发现系统中竟没有中文输入法

    安装完Linux Mint后,发现系统中竟没有中文输入法,语言支持之后自动更新过程中有些安装包下载失败. 可以采取下面的方法安装上中文输入法. 1. 安装iBus: sudo add-apt-repo ...

  3. Qt5的插件机制(1)--Qt 框架中的插件载入机制概述

    概述 Qt的源代码中通过 Q<pluginType>Factory.Q<pluginType>Plugin 和 Q<pluginType> 这三个类实现了Qt的插件 ...

  4. Win10 改为用 Ctrl+Shift 切换中英输入语言而不是 Win+空格

    是切换中英输入语言,而不是切换输入法,如图: 步骤: 设置 > 设备 > 输入 > 高级键盘设置 > 语言栏选项 > 高级键盘设置 > 更改按键顺序 > 切换 ...

  5. [转]从普通DLL中导出C++类 – dllexport和dllimport的使用方法(中英对照、附注解)

      这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的.但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但 ...

  6. Qt组件中的双缓冲无闪烁绘图

      双缓冲绘图在Qt4中,所有的窗口部件默认都使用双缓冲进行绘图.使用双缓冲,可以减轻绘制的闪烁感.在有些情况下,用户要关闭双缓冲,自己管理绘图.下面的语句设置了窗口部件的Qt::WA_PaintOn ...

  7. 自定义的插件如何加载到Qt Designer中(详细)

    要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...

  8. Qt 5中信号和槽的新语法

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  9. webstorm快捷键 webstorm keymap内置快捷键英文翻译、中英对照说明

    20160114参考网络上的快捷键,整理自己常用的: 查找/代替shift+shift 快速搜索所有文件,简便ctrl+shift+N 通过文件名快速查找工程内的文件(必记)ctrl+shift+al ...

  10. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

随机推荐

  1. WebAssembly 基础以及结合其他编程语言

    0x00 WebAssembly 基础 详情参考<WebAssembly | MDN> (1)概述 WebAssembly 简称 WASM 或 WA,是一种新的编码方式,可以在现代的 We ...

  2. 通过自定义字符串内插处理程序(InterpolatedStringHandler)和CallerArgumentExpression特性来实现一个好玩的场景

    背景知识介绍 什么是自定义字符串内插处理程序? 简单来讲就是自定义一个高性能的字符串拼接程序 通过 $"{a}{b}"的方式. 什么是CallerArgumentExpressio ...

  3. 修复 K8s SSL/TLS 漏洞(CVE-2016-2183)指南

    前言 测试服务器配置 主机名 IP CPU 内存 系统盘 数据盘 用途 zdeops-master 192.168.9.9 2 4 40 200 Ansible 运维控制节点 ks-k8s-maste ...

  4. linux 配置apache的虚拟主机

    基于web的开发,若没有配置虚拟主机,一直在浏览器输入localhost/projectname有点复杂 特别是类似thinkphp框架的,一大串:localhost/php/tp5/public.. ...

  5. LiveData

    ViewModel 添加依赖 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' activity_main.xml < ...

  6. KubeSphere 最佳实战:Kubernetes 部署集群模式 Nacos 实战指南

    Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 是构建以服 ...

  7. python项目实战——人生重开模拟器

    文章目录 1.菜单栏的编写 2.玩家确定颜值.体质.智力.家境 3.生成性别 4.设定角色出生点 5.各个年龄段的变化 5.1 幼年阶段 5.2 青年阶段 5.3中年阶段 5.4 晚年阶段 6.整体代 ...

  8. 3.4 Linux文件(目录)命名规则

    介绍完 Linux 系统中目录结构之后,读者一定想知道如何为文件或目录命名. 我们知道,在 Linux 系统中,一切都是文件,既然是文件,就必须要有文件名.同其他系统相比,Linux 操作系统对文件或 ...

  9. register at least one qt version using“qt vs tools“->“qt options“问题描述及解决方法

    问题描述:在安装了Qt 5.9.8,vs 2022, QT VS Tool 2022并配置好环境变量之后创建Qt项目时无法创建,提示至少需要注册一个Qt版本到Qt VS Tools的Qt Option ...

  10. java.lang.NoSuchMethodError: org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(Ljava/io/File;Z) 报错处理

    字面看下:没有该方法,首先应该推测有可能是Jar冲突导致的,因为一些jar中的类在升级的过程中不会向下兼容,所以有一些高级属性或方法就jar中没有,此POI就是. 可以先看下这个类的资源加载路径: C ...