一、前言

最近有个朋友找我定制一个输入法,需要高仿一个苹果MAC电脑的输入法,MAC操作系统的审美无疑是相当棒的,于是乎直接拿以前的输入法高仿了一个,由于之前有做过输入法这块的开发,而且改进了四年,各种需求都遇到过,陆陆续续完善了很多年,所以这个高仿起来难度不大,而且要支持滑动选词,直接撸代码。

二、实现的功能

1:采用Qt系统层输入法框架,独创输入切换机制。

2:纯QWidget编写,支持任何目标平台(亲测windows、linux、嵌入式linux等),支持任意Qt版本(亲测Qt4.6.0到Qt5.11.2),支持任意编译器(亲测mingw、gcc、msvc等),支持任意控件输入包括网页中的输入控件。

3:调用极为方便,pri文件调用形式,只要改成文件包含即可,例如pro文件中写 include($$PWD/inputnew/inputnew.pri)。

4:界面清晰简洁,UI美观友好,非常适合触摸设备。

5:同时支持实体键盘输入+鼠标单击输入+触摸输入。

6:支持Qt程序嵌入的浏览器中的网页中的文本框等控件的输入。

7:支持迷你模式,界面大小随意设置,采用布局自使用任何分辨率。

8:支持纯数字键盘模式,自由控制弹出完整输入法面板和数字键盘面板,只需要对控件设置属性即可。例如ui->txt->setProperty(“flag”, “number”);

9:自由控制需要显示输入法和不需要显示输入法,当某些控件不需要弹出输入法,只需要对应不需要弹出输入法的控件设置属性noinput为真即可。例如ui->txt->setProperty(“noinput”, true);

10:界面自适应屏幕大小,输入法弹出位置为控件底部时,当超过桌面右边或者底部时,自动调整位置。

11:实现了长按超过500毫秒重复执行按下的键的功能。例如长按退格键,不断删除。

12:shift键切换输入法,esc键隐藏输入法,空格选中第一个汉字,回车选中输入的拼音。和搜狗输入法处理一致。

13:英文、中文、数字字母、大小写、特殊字符自由切换。

14:支持单拼双拼词组输入,网上大部分只支持单个汉字输入。智能分页算法,可任意翻页查看汉字词组。

15:默认自带5种皮肤颜色,可随意切换,用户也可用QSS自定义皮肤。

16:字库文件可大可小,提供迷你版字库大小仅120KB,方便存储空间紧张的硬件,完整版字库25MB。

17:可选谷歌内核的输入法引擎,字库文件1MB,不依赖数据库,资源占用低效率极高。支持模糊拼音,比如nh=你好。

18:可选windows专有版本,支持外部程序输入,比如输入到记事本、QQ聊天窗口等。

19:整个输入法代码行数1000行左右,非常小,不会对程序增加大小造成负担。

20:代码结构极为清晰,注释详细,非常容易阅读和理解,同时也可以自行修改拓展自定义的需求。

三、突出功能

1:界面重新布局,高仿IOS输入法。

2:顶部滑动选词+弹出汉字面板选词,支持滑动。

3:增加记忆功能,优先词库首先显示,支持单个拼音多个汉字,自动调整优先级。

4:增加造词功能,可以直接打开文件文件写入自定义词组,最高级别显示。

四、效果图

五、核心代码

void frmInput2019::btnClicked(){ QPushButton *btn = (QPushButton *)sender(); QString objectName = btn->objectName(); QString btnText = btn->text(); QString labText = ui->labPY->text(); ui->scrollAreaCn->horizontalScrollBar()->setValue(0); ui->scrollAreaMore->verticalScrollBar()->setValue(0); if (objectName == "btnUpper") { upper = !upper; setUpper(upper); clearChinese(); ui->labPY->clear(); } else if (objectName == "btnNumber") { setInputType("number"); } else if (objectName == "btnNumber2") { number = !number; setNumber(number); } else if (objectName == "btnDelete" || objectName == "btnDelete2") { //如果当前是中文模式,则删除对应拼音,删除完拼音之后再删除对应文本输入框的内容 int len = labText.length(); if (inputType == "chinese" && len > 0) { ui->labPY->setText(labText.left(len - 1)); selectChinese(); } else { deleteValue(); } ui->scrollAreaCn->horizontalScrollBar()->setValue(0); ui->scrollAreaMore->verticalScrollBar()->setValue(0); } else if (objectName == "btnSpace" || objectName == "btnSpace2") { //如果中文模式而且有待输入字母,判断是否有中文则插入第一个中文否则插入字母 if (inputType == "chinese" && !labText.isEmpty()) { QString text = labCn.first()->text(); text.isEmpty() ? insertValue(labText) : insertValue(text); clearChinese(); } else { insertValue(" "); } } else if (objectName == "btnEnter" || objectName == "btnEnter2") { //如果中文模式而且有待输入字母则立即插入字母 if (inputType == "chinese" && !labText.isEmpty()) { insertValue(labText); clearChinese(); } if (currentWidget != 0 && currentWidget->inherits("QLineEdit") && !onlyControl) { hidePanel(); QKeyEvent keyPress(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier, QString("")); QApplication::sendEvent(currentWidget, &keyPress); } else { insertValue(""); } } else { //如果是&按钮,因为对应&被过滤,所以真实的text为去除前面一个&字符 if (btnText == "&&") { btnText = "&"; } //当前不是中文模式,则单击按钮对应text为传递参数,大写优先 if (inputType != "chinese" || upper) { insertValue(btnText); } else { if (btn->property("btnLetter").toBool()) { ui->labPY->setText(labText + btnText); selectChinese(); } } }}void frmInput2019::focusChanged(QWidget *oldWidget, QWidget *nowWidget){ //qDebug() << "oldWidget:" << oldWidget << "nowWidget:" << nowWidget; this->currentWidget = nowWidget; if (nowWidget != 0 && !this->isAncestorOf(nowWidget)) { //如果对应属性noinput为真或者只读则不显示 if (nowWidget->property("noinput").toBool() || nowWidget->property("readOnly").toBool()) { currentWidget = 0; QTimer::singleShot(0, this, SLOT(hidePanel())); return; } if (nowWidget->inherits("QWidget")) { //合法的输入控件,可以自行增加 QStringList classNames; classNames << "QLineEdit" << "QTextEdit" << "QPlainTextEdit" << "QAbstractSpinBox" << "QComboBox"; classNames << "QQuickWidget" << "QWebView" << "QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget"; //查找当前焦点控件是否属于合法输入的控件 bool exist = false; foreach (QString className, classNames) { if (nowWidget->inherits(className.toLatin1().constData())) { //如果当前是下拉框则判断下拉框可编辑属性是否为真 if (className != "QComboBox" || nowWidget->property("editable").toBool()) { exist = true; break; } } } if (exist) { showPanel(); movePosition(); } else { currentWidget = 0; hidePanel(); } } }}void frmInput2019::movePosition(){ //根据用户选择的输入法位置设置-居中显示-底部填充-显示在输入框正下方 static int deskWidth = qApp->desktop()->availableGeometry().width(); static int deskHeight = qApp->desktop()->availableGeometry().height(); int width = this->width(); int height = this->height(); if (position == "center") { QPoint pos = QPoint(deskWidth / 2 - width / 2, deskHeight / 2 - height / 2); this->setGeometry(pos.x(), pos.y(), width, height); } else if (position == "bottom") { this->setGeometry(0, deskHeight - height, deskWidth, height); } else if (position == "control") { QRect rect = currentWidget->rect(); QPoint pos = QPoint(rect.left(), rect.bottom() + 2); pos = currentWidget->mapToGlobal(pos); int x = pos.x(); if (x + width > deskWidth) { x = deskWidth - width; } int y = pos.y(); if (y + height > deskHeight) { y = y - height - rect.height() - 2; } this->setGeometry(x, y, width, height); }}

qt designer文本输入框_Qt编写高仿苹果MAC电脑输入法(支持触摸滑动选词)相关推荐

  1. Qt编写高仿苹果MAC电脑输入法(支持触摸滑动选词)

    最近有个朋友找我定制一个输入法,需要高仿一个苹果MAC电脑的输入法,MAC操作系统的审美无疑是相当棒的,于是乎直接拿以前的输入法高仿了一个,由于之前有做过输入法这块的开发,而且改进了四年,各种需求都遇 ...

  2. Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

    转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文 ...

  3. 小马哥----高仿苹果5se 机型界面图面面观,低配机型 谨防假冒

    遇到的这款高仿苹果5se 主板芯片为6572 nand字库 整机连接手机调换到内存卡模式.只有12m 坑爹的山寨 上图拆机图与整机前后图

  4. 小马哥----高仿苹果6S A236 刷机拆机主板图与开机界面图 更新解锁界面 全网通4G 警惕

    高仿苹果的版本较多 A系列   R系列    LT系列    Q系列  TD系列  S系列 等等机型版本 刷机建议要拆机看主板型号来救砖 LT系列的有LT6082     LT6000V     LT ...

  5. 小马哥---高仿苹果6 R7226刷机拆机主板图与开机识别图 修改WiFi信号增强

    高仿苹果6与6s  6sp系列版本较多  截止目前遇到的多达几十种 其中A系列的  如A233  A231 A235  A236新版与旧版系列的如A192 A193 A185 A175等等 R系列   ...

  6. 小马哥----高仿苹果6S A235刷机拆机图与开机界面图 真八核6735芯片 精仿系列机

    高仿苹果的版本较多 A系列   R系列    LT系列    Q系列  TD系列  S系列 等等机型版本 刷机建议要拆机看主板型号来救砖 LT系列的有LT6082     LT6000V     LT ...

  7. 小马哥----高仿苹果6s 主板型号S106s 更换内核 刷机拆机主板图与开机识别图

    高仿苹果系列版本较多 S106 系列有s106  s106L S106F等版本 这次说明的是S106s的版本机型 S106s与s106相比来说 明显的主板与做工很差  主板就可以对比出来 而且分日期版 ...

  8. 小马哥---山寨高仿苹果x 主板型号s306 机型图示展示

    苹果x发布会不久.市场已经出现高仿苹果x版本欲购买苹果x的网友 谨记走正规渠道购买.避免贪小便宜购买到假货.吃亏上当 正品苹果x 售价万元.购买到假货 损失就大了 最近遇到一款山寨苹果x版本 拍图与网 ...

  9. 小马哥----高仿苹果6 主板型号LT6082 芯片6582 真2g运存 15年新版山寨机型

    高仿苹果的版本较多 A系列   R系列    LT系列    Q系列  TD系列  S系列 等等机型版本 刷机建议要拆机看主板型号来救砖 此次展示的是LT系列中的LT6082机型版本 这种系列的有LT ...

最新文章

  1. 2021年人工神经网络第四次作业 - 第三题Cifar10
  2. mysql存储数据到cephfs_采用cephfs实现Elasticsearch数据持久化
  3. Java学习笔记之equals和Objects.equals
  4. fritz 使用手册_Fritz对象检测指南:使用机器学习在Android中构建宠物监控应用
  5. 使用Webtask.io创建一个简单的REST API端点
  6. wifi android手机版下载地址,手机随身wifi下载-手机随身WiFi 安卓版v1.6.3-PC6安卓网...
  7. html flex 表单样式,Flexbox 布局的最简单表单的实现
  8. path的图片下拉效果
  9. php 说说,PHP程序员:你过来,给我说说 $this,self,static 有什么区别?
  10. Android JS 通过X5WebView相互调用详解
  11. 智慧城市建设的实践经验
  12. 22年新款MacBookAir屏幕解析
  13. 程序员网站有哪些?(欢迎补充)
  14. 设定session.timeout=30后,可是不到5分钟session变量就消失了.为什么?
  15. hexo主题之hexo-theme-yilia-plus
  16. 【Word】长文档排版
  17. Android中铃声的使用
  18. 小猿圈之常见java面试题总结,你学会了吗?
  19. VMware的下载和安装(最详细)
  20. w ndows10QQ远程,Win10提示“QQ远程系统权限原因,暂时无法操作”的解决方法

热门文章

  1. 网易回应养猪欠债风波:猪场勘探费极不合理
  2. 年轻人买中古、喝酒的地方,换成了精品咖啡馆?
  3. 中国首款量子计算机控制系统诞生,国内首款量子计算机控制系统诞生
  4. 万维网和互联网有什么不同
  5. Java中抽象类实现接口
  6. Event事件-1:addEventListener事件监听 / 事件冒泡事件捕获 / 事件委托 / preventDefault 阻止默认行为 / cancelBubble、stopPropa...
  7. 曲线调薪是落后也是无奈
  8. 一支口红用了5年_经常使用的这5支口红
  9. parent-child 关系介绍
  10. 词法、语法、语义分析实验