效果演示 :

开发板输入需要用到软键盘,Qt自带的虚拟键盘时qml写的,可惜我不会qml,移植到开发板上有各种问题还找不到原因,索性自己写一个简单的软键盘,用的是Google输入法源码,练手所做水平有限。有疑问欢迎留言商讨,共同进步。

源码地址:https://github.com/zuotian0222/InputMethod.git

实现思路:

1.实现自定义按钮KeyButton,继承自QPushButton,简单的添加了两个私有变量,int key;QString value,用来存放键值和字符,添加信号,当按钮按下发送key和value;

{/*支持长按*/this->setAutoRepeat(true);this->setAutoRepeatDelay(500);this->setAutoRepeatInterval(100);connect(this,&QPushButton::pressed,this,&KeyButton::slot_onPressed);
}void KeyButton::setValue(QString value)
{this->value = value;this->setText(value);
}void KeyButton::setKey(int key)
{this->key = key;
}void KeyButton::slot_onPressed()
{emit key_pressed(key,value);
}

2.实现键盘KeyBoard,在UI文件中添加适量按钮并合理布局,需要按键响应的按钮提升为KeyButton;添加中文输入框和中文候选框,候选框用的是QListWidget 设置为横向排列,水平滚动;将按键响应的按钮添加进列表管理,列表添加 小写,大写,数字字符三种状态的键值和输出字符,切换状态时通过列表遍历按钮进行加载,绑定按钮点击信号,接收键值和输出字符,

 //按钮绑定槽函数for(KeyButton * btn : keyBtnList){connect(btn,&KeyButton::key_pressed,this,&KeyBoard::slot_key_keyEvent);}void KeyBoard::slot_key_keyEvent(int key,QString value)
{QKeyEvent keyPress(QEvent::KeyPress, key, Qt::NoModifier, value);QApplication::sendEvent(edit, &keyPress);
}

通过键盘事件发送出去,edit为接收的键盘事件的控件。

3.中文输入,Input类包含Google输入法源码,init函数加载两个dat文件,无则从资源文件中拷贝,设置拼音、输出最大长度;search函数通过传入拼音字符串返回匹配到的汉字个数 get_candidate函数返回一定的汉字列表,再将汉字列表显示到候选框即可。对Google输入法源码了解颇浅,没有实现拼音拆分匹配,仅在选中汉字后全部清空。

bool Input::init(int max_spell_len, int max_out_len)
{QString path = QDir::currentPath();qDebug()<<path;QFile file_pinyin(dict_path);if(!file_pinyin.exists()){QFile::copy(":/dict/dict_pinyin.dat", path+"/"+dict_path);QFile::setPermissions(path,QFileDevice::ReadOther|QFileDevice::WriteOther);}QFile file_user(dict_user_path);if(!file_user.exists()){QFile::copy(":/dict/dict_pinyin_user.dat",path+"/"+dict_user_path);QFile::setPermissions(path,QFileDevice::ReadOther|QFileDevice::WriteOther);}m_spell_len = max_spell_len;m_out_len = max_out_len;bool ret = im_open_decoder(QString("%1/"+dict_path).arg(path).toLocal8Bit().data(),QString("%1/"+dict_user_path).arg(path).toLocal8Bit().data());if(!ret)return ret;im_set_max_lens(static_cast<size_t>(m_spell_len),static_cast<size_t>(m_out_len));reset_search();m_able = ret;return ret;
}unsigned int Input::search(const QString spell)
{if (!m_able)return 0;QByteArray bytearray;char    *pinyin;bytearray = spell.toUtf8();pinyin = bytearray.data();size_t candnum = im_search(pinyin, static_cast<size_t>(bytearray.size()));if(static_cast<int>(candnum) < m_out_len){return static_cast<unsigned int>(candnum);}return static_cast<unsigned int>(m_out_len);
}QStringList Input::get_candidate(unsigned int candnum)
{   QStringList textList;if(candnum == 0)return textList;char16 * cand_buf = new char16[m_out_len];for (unsigned int i = 0; i < candnum; i++) {char16 *cand;cand = im_get_candidate(i, cand_buf, static_cast<unsigned int>(m_out_len));if(cand){textList.append(QString::fromUtf16(cand));}else {continue;}}delete[] cand_buf;//qDebug()<<textList;return textList;
}

4.使用,需要输入的控件通过setEdit函数传入。

    keyboard = new KeyBoard();keyboard->resize(600,300);ui->lineEdit->installEventFilter(this);ui->lineEdit_2->installEventFilter(this);ui->lineEdit_3->installEventFilter(this);bool Widget::eventFilter(QObject *w, QEvent *e)
{if(w->inherits("QLineEdit") && e->type() == QEvent::MouseButtonRelease){QWidget * p = qobject_cast<QWidget *>(w);keyboard->setEdit(p);QPoint posA = p->mapToGlobal(QPoint(0, 0));keyboard->move(posA.x(),posA.y()+p->height());keyboard->show();}return QWidget::eventFilter(w,e);
}

Qt 基于Google引擎的拼音输入法相关推荐

  1. Google推出谷歌拼音输入法

    http://www.google.com/support/pinyin/ 谷歌拼音有以下几大特色: ·智能组句:选词准确率高,能聪明地理解您的意图,短句长句都合适. ·流行词汇:整合互联网上的流行词 ...

  2. 忽然发现Google拼音输入法还有个好处 中文分词

    中文分词 对搜索引擎来说是个大麻烦, Google有了拼音输入法后, 就能及时收集到又新双全的中文词库, 李彦宏 也应搞个输入法才行

  3. Ubuntu 10.10 安装谷歌拼音输入法~

    Ubuntu 10.10 安装谷歌拼音输入法 Ubuntu其实自己带的输入法ibus也不是很烂,只是感觉输入起来有些词语非常麻烦,比如"的"默认在第二个,而且词频还无法调整.于是想 ...

  4. ubuntu11.10 安装谷歌拼音输入法详细步骤

    Ubuntu其实自己带的输入法ibus也不是很烂,只是感觉输入起来有些词语非常麻烦,比如"的"默认在第二个,而且词频还无法调整.于是想到GOOGLE谷歌的拼音输入法,找了很多Ubu ...

  5. 树莓派4B-安装中文输入法Fcitx及Google拼音输入法

    树莓派安装Google拼音输入法 在安装之前请确保你的软件源已经切换国内否则可能因为网络问题安装失败 更换软件源教程:树莓派更换国内软件源 安装中文输入法时,需要使用到Fcitx框架,Fcitx 内置 ...

  6. 基于文本服务框架的拼音输入法研究与实现

    摘要:目前的输入法大多采用输入法管理器-输入法编辑器(IMM-IME)进行开发,对于微软发布的新型输入法技术―文本服务框架(TSF)的研究一直比较滞后,该文论述了 TSF 的基本构成.主要接口.输入法 ...

  7. Ubuntu 12.04中设置安装Google拼音输入法

    写在最前 好久没写文章了,随着近期时间的充裕,肯定会加快会博文更新的速度.言归正传,在安装英文Linux系统后(作为开发来说,本人更倾向于安装英文语言环境 的Linux系统,这样各种提示,尤其是错误提 ...

  8. ubuntu下安装google拼音输入法

    ubuntu下安装google拼音输入法 step 1:设置root帐号密码 输入命令: sudo passwd root 根据提示输入root帐号密码. step 2:保证以root帐号权限进行后续 ...

  9. [转]Google开发拼音输入法背后的故事

    又一个新产品诞生了,昨天Google(谷歌)推出了首款输入法产品--google拼音输入法.也许有人要问,如拼音加加.紫光.搜狗等产品已经占据了市场,Google(谷歌)为什么还要做输入法?它是如何诞 ...

  10. xubuntu18.04安装Google拼音输入法

    安装小企鹅(fcitx) sudo apt install fcitx 安装google拼音输入法 sudo apt install fcitx-googlepinyin 用vim编辑xprofile ...

最新文章

  1. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应
  2. ​Xamarin iOS教程之自定义视图
  3. [转]分布式文件系统 MogileFS 安装手册
  4. vue在微信里面的兼容问题_微信H5页面兼容性问题分析及解决方法
  5. jaccard相似度_Jaccard与cosine文本相似度的异同
  6. 串的模式匹配(KMP算法)
  7. 推荐系统算法_CUCS | 推荐系统算法简介Matrix Factorization(矩阵分解)
  8. 解决OpenCV4出现“/usr/bin/ld:cannot find -lcudart_static.../usr/bin/ld: cannot find -lx86_64-linux-gnu“问题
  9. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密
  10. 迅捷CAD编辑器剪切框架工具具体使用方法
  11. 家庭版联想台式计算机,联想台式机预装win10家庭版升级win10专业版方法教程
  12. python爬虫豆瓣电影评价_用python爬虫对豆瓣《战狼2》电影47万短评做词云
  13. 2017个人工作感悟
  14. 51CTO学院三周年-51cto学院伴我成长
  15. u云支付 php05,优云易支付-免签约支付平台-彩虹易支付,1分钟快速接入支付功能...
  16. 华东师范大学计算机模拟试题,华东师范大学计算机机试真题
  17. python第三方库——xlrd和xlwt操作Excel文件学习
  18. YOLOv7训练自己的数据集(超详细)
  19. 传智播客成都Java培训中心
  20. 猿人学之访问逻辑罗生门

热门文章

  1. 让电脑「读懂」你的思想——java工程师的职业规划
  2. 数字电视输出标准规范和BT601/BT709/BT2020色域转换方法资料整理
  3. android--关于apk加密那点事的思考
  4. 教资高中计算机知识点,如何备考教师资格证高中信息技术
  5. django实现下载功能
  6. 74ls系列芯片的分类
  7. 计算机网络体系结构中的环节,ppt课件-第二章计算机网络体系结构.ppt
  8. Remoting整理
  9. 详尽的msf——meterpreter——渗透测试教程
  10. 知了课堂 python_知了传课 - 主页