• 19037阅读
  • 42回复

支持中文输入的虚拟键盘输入法 [复制链接]

上一主题 下一主题
离线liuyuanan
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2017-03-17
声明:
1.我是在刘大侠开源的源代码基础上修改的,我并没有获取刘大侠关于中文输入部分的代码,刘大侠开源的输入法链接如下:
http://www.qtcn.org/bbs/read-htm-tid-58920-ds-1.html#tpc
2.本人一直关注并敬仰刘大侠,因为刘大侠开源了很多自己的辛苦劳动成果!在此对大侠表示感谢!我无意侵犯刘大侠的个人版权,如有侵权请联系我,我会在第一时间删帖
3.本输入法只能输入单个中文汉字,如果需要输入词组,请大家自行完善,因为此刻为止我也没有实现此功能。关于词组输入,我的思路如下(借鉴搜狗拼音输入法):
   1)在数据中新建一个数据库表,此表用于存储词组拼音和词组中文汉字
   2)当用户输入词组拼音时,如输入“women”,程序查找词组数据库表,将查询结果显示界面。同时,程序自动将“women”字符串进行拆分,拆分后结果如下:“wo·men”(我提供的数据库表有声母和韵母,相信根据声母拆分并不困难)
  3)当用户按“+”或“-”键时,变换“wo”对应的汉字,当用户选择“wo”对应的汉字后(假设选择“我”),界面显示“我·men”,然后用户继续选择“men”对应的汉字。当用户选择完毕后,将信息【“women”--我们】存入数据库词组表。
4.请广大Qt开发者继续完善这个虚拟键盘输入法,完善后继续上传到本网站供大家学习!!
5.我特别鄙视那种只取别人的成果又不贡献自己劳动成果的人!如果你是这种人,请不要窃取我的劳动成果!!


进入正题,软件运行效果图:





源码:源码 QtSoftKeyboard.zip (344 K) 下载次数:666

-------------------------------------------------2017-03-19更新-------------------------------------------
重要更新:

15:54 2017/3/19
1.支持单个汉字输入
2.支持词组输入
3.支持汉字拼音自动分词
4.如果用户输入的词组拼音在词组数据库中找不到对应的记录,当用户选择对应的汉字后,自动将词组存入数据库,当用户再次输入该词组后会显示上次选择的词组

待完成:
1.汉字拼音自动分词还有些问题,如输入“tongxue”,程序没有正确分词
2.假设用户输入的词组拼音“tongxue”在词组数据库中没有记录,当用户选择“tong”对应的汉字“同”后,输入法界面拼音标签应显示“同`xue”,当用户输入退格键后,输入法界面拼音标签应显示“tong`xue”(模仿搜狗拼音输入法)


再次声明:
1.对于本人发布到本论坛的所有开源程序,我只是抛砖引玉,欢迎广大开发者修改程序,并将你改善后的程序再次发布到网上供大家学习!
2.欢迎大家改善我发布的所有程序,强烈请求大家将改善后的程序再次发布到网上供大家学习!

软件运行效果图:
拼音自动分词效果:




词组输入效果1:




词组输入效果2:




源码:
2017-03-19 QtSoftKeyboard2017-03-19.zip (697 K) 下载次数:585

-------------------------------------------------2018-03-03更新-------------------------------------------
感谢热心网友的支持和关注,由于之前工作比较忙,没时间弄这个,今天有时间就改进了一下。


更新说明:
21:14 2018/3/2
1.支持汉字拼音自动分词,已全部正确分词

待完成:
1.假设用户输入的词组拼音“tongxue”在词组数据库中没有记录,当用户选择“tong”对应的汉字“同”后,输入法界面拼音标签应显示“同`xue”,当用户输入退格键后,输入法界面拼音标签应显示“tong`xue”(模仿搜狗拼音输入法)
2.训练词组拼音(使用开源分词库《NLPIR汉语分词系统》实现)
思路:从网上下载电子书,将电子书内容加载到《NLPIR汉语分词系统》,经过分词系统将词组分组后,再将词组进行中文转拼音操作,最终将中文词组和拼音存入数据库。
3.优化拼音词组搜索速度,目前搜索速度有点慢。关于如何提高搜索的速度,网友们有什么想法?请广大网友帮我出招,感激不尽!

词组输入效果1:


词组输入效果2:


词组输入效果3:




源码:
QtSoftKeyboard2018-03-03.zip (326 K) 下载次数:391



本帖提到的人: @liudianwu
离线liudianwu

只看该作者 1楼 发表于: 2017-03-18
看了下。超过9.9成代码一模一样!函数命名,参数结构,注释,完全一致!鉴定完毕!
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线liuyuanan

只看该作者 2楼 发表于: 2017-03-18
回 liudianwu 的帖子
liudianwu:看了下。超过9.9成代码一模一样!函数命名,参数结构,注释,完全一致!鉴定完毕![表情]  (2017-03-18 09:25) 

刘大侠,我开篇就说了是在你的代码基础上修改的,我只是加入中文输入而已。上传的目的是让大家共同学习!
离线nigoole

只看该作者 3楼 发表于: 2017-03-18
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线liudianwu

只看该作者 4楼 发表于: 2017-03-19
回 liuyuanan 的帖子
liuyuanan:[表情]刘大侠,我开篇就说了是在你的代码基础上修改的,我只是加入中文输入而已。上传的目的是让大家共同学习! (2017-03-18 14:47) 

我只是看到你把我双拼查询的那行代码注释了,改成了单拼哦!这是我看到的唯一一行不同的代码!其他完全一致哦!
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线liuyuanan

只看该作者 5楼 发表于: 2017-03-19
回 liudianwu 的帖子
liudianwu:我只是看到你把我双拼查询的那行代码注释了,改成了单拼哦!这是我看到的唯一一行不同的代码!其他完全一致哦! (2017-03-19 13:27) 

本次发布主要精力放在了处理汉字拼音对照上面去了,我会持续更新的,还望刘大侠多多指教啊
离线zhenonline

只看该作者 6楼 发表于: 2017-03-20
中文出不来
离线t1029901995

只看该作者 7楼 发表于: 2017-03-20
中文出不来
离线liuyuanan

只看该作者 8楼 发表于: 2017-03-20
回 zhenonline 的帖子
zhenonline:中文出不来
 (2017-03-20 00:07) 

仔细看看代码,要把数据库文件拷贝到bin目录下
离线liuyuanan

只看该作者 9楼 发表于: 2017-03-20
回 t1029901995 的帖子
t1029901995:中文出不来 (2017-03-20 10:00) 

一看就没有仔细看代码,仔细看看代码,要把数据库文件拷贝到bin目录下
离线lishaoguang5

只看该作者 10楼 发表于: 2017-06-17
                    
离线梦寻未央

只看该作者 11楼 发表于: 2017-07-14
离线aahellaa

只看该作者 12楼 发表于: 2017-08-25
感谢各位高手,学习一下,很实用的程序,
离线aahellaa

只看该作者 13楼 发表于: 2017-08-28
感谢刘大侠和版主的源代码,我看了后修正了一下版主修改后的自动分词功能,修改后分词能力有一定的改善,就是在splitPinyin函数里添加了几句代码,大家再改版一下,让功能更完善一些。这里电脑发不了附件。直接发代码吧。在该函数的是否拼音前面添加代码


if(tmp.right(1)=="u"||tmp.right(1)=="a"||tmp.right(1)=="e"||tmp.right(1)=="o"||tmp.right(1)=="n")        {            outPinyin.append(*it);            continue;        }
自动分词能力会有一定加强,
离线liudianwu

只看该作者 14楼 发表于: 2017-09-02
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线12345654321

只看该作者 15楼 发表于: 2017-09-08
大神,有没有研究过QT自带的虚拟键盘中文输入法?若有的话,怎样改中文输入法的备选词的字体大小?求大神指导下,万分感谢,感激不尽!!
离线aahellaa

只看该作者 16楼 发表于: 2017-09-14
回 liudianwu 的帖子
liudianwu:
[图片]

离线aahellaa

只看该作者 17楼 发表于: 2017-09-14
我测试了下没问题啊。        
//尝试查询拼音
        QString sqlQueryCizu = "select [type] from [hzpy] where [pinyin]='" + tmp + "';";
        query.exec(sqlQueryCizu);
        qDebug()<<tmp<<shengmu<<yunmu<<outPinyin;

        if(tmp.right(1)=="u"||tmp.right(1)=="a"||tmp.right(1)=="e"||tmp.right(1)=="o"||tmp.right(1)=="n")
        {
            outPinyin.append(*it);
            continue;
        }
        //是否拼音
        if(query.next())//||tmp=="zho"||tmp=="zhon")
        {
离线aahellaa

只看该作者 18楼 发表于: 2017-09-19
tmp.append(*it);
        //尝试查询拼音
        QString sqlQueryCizu = "select [type] from [hzpy] where [pinyin]='" + tmp + "';";
        query.exec(sqlQueryCizu);
        qDebug()<<tmp<<shengmu<<yunmu<<outPinyin;

        if(tmp.right(1)=="u"||tmp.right(1)=="a"||tmp.right(1)=="e"||tmp.right(1)=="o"||tmp.right(1)=="n")
        {
            outPinyin.append(*it);
            continue;
        }
        //是否拼音
        if(query.next())//||tmp=="zho"||tmp=="zhon")
        {
            qDebug()<<"Is Pinyin"<<tmp<<shengmu<<yunmu<<outPinyin;
            outPinyin.append(*it);
            continue;
        }
        //是否声母
        if(m_shengmuList.contains(tmp))//声母列表
        {
            if(tmp != 'n')
            {
                qDebug()<<"Is shengmu"<<tmp<<shengmu<<yunmu;
                outPinyin.append(*it);
                continue;
            }
        }
        //------------以下处理既不是声母也不是拼音
        if(1 == tmp.length())//输入i或v时
        {
            qDebug()<<tmp<<shengmu<<yunmu<<outPinyin;
            outPinyin.append(*it);
            outPinyin.append('`');
            continue;
        }
        qDebug()<<"over"<<tmp<<shengmu<<yunmu;
        outPinyin.append('`');
        tmp.clear();
        it--;
离线chongyong

只看该作者 19楼 发表于: 2017-09-19
你好,楼主。
我发现一个bug,在splitPinyin()这里有一种情况没处理好。
fe,或者we,ho这类在pinyin字段里面查不到,又不是声母的时候,你会给它分词。
其实这样是不合理的。
fei,fen,wen, hong都打不出来。

解决方案: 那个函数里面增加一个这个。
        // 是否包含在拼音里面,比如之前的fe,we,ho,都没处理到。fei,wen,hong
        QString sqlQueryCizu1 = "select [type] from [hzpy] where [pinyin] like '%" + tmp + "%';";
        query.exec(sqlQueryCizu1);
        if(query.next())
        {
            outPinyin.append(*it);
            continue;
        }

目前测试是好的,不知道还会不会有bug
离线1371476785

只看该作者 20楼 发表于: 2017-10-16
回 liuyuanan 的帖子
liuyuanan:[表情]刘大侠,我开篇就说了是在你的代码基础上修改的,我只是加入中文输入而已。上传的目的是让大家共同学习! (2017-03-18 14:47) 

感谢你的代码,刘大侠的代码开口就要100块,没有还价的余地,感谢你的开源。学习一下。
离线dubuzherui

只看该作者 21楼 发表于: 2017-10-31
    
电力系统Qt开发
离线seuraa

只看该作者 22楼 发表于: 2017-11-15
  刚好用到了 谢谢
离线seuraa

只看该作者 23楼 发表于: 2017-11-15
回 chongyong 的帖子
chongyong:你好,楼主。
我发现一个bug,在splitPinyin()这里有一种情况没处理好。
fe,或者we,ho这类在pinyin字段里面查不到,又不是声母的时候,你会给它分词。
其实这样是不合理的。
fei,fen,wen, hong都打不出来。
....... (2017-09-19 15:29) 

老哥 稳
离线chongyong

只看该作者 24楼 发表于: 2017-11-17
回 seuraa 的帖子
seuraa:老哥 稳 (2017-11-15 15:55) 

哈哈  不稳不稳   我也没仔细测过
离线hc976865965

只看该作者 25楼 发表于: 2017-11-27
运行完不是输入法的这个界面啊
离线wfwjp

只看该作者 26楼 发表于: 2017-12-20
  
怎么修改下,只是用于某一个弹出窗口的一个lineedit啊?
离线berkley

只看该作者 27楼 发表于: 2018-01-03
真心点赞,输入法现在刚好能用到,帮大忙了
离线pipipipapapa

只看该作者 28楼 发表于: 2018-01-09
为什么我把数据库文件放到了bin目录下还是没有中文呢
离线pipipipapapa

只看该作者 29楼 发表于: 2018-01-23
你好,怎么让输入的时候,lineedit这些控件一直有光标闪烁呢,现在是一输入,光标就不见了,这么让光标一直存在呢
本帖提到的人: @lgao622
离线liuyuanan

只看该作者 30楼 发表于: 2018-03-03
回 chongyong 的帖子
chongyong:你好,楼主。
我发现一个bug,在splitPinyin()这里有一种情况没处理好。
fe,或者we,ho这类在pinyin字段里面查不到,又不是声母的时候,你会给它分词。
其实这样是不合理的。
fei,fen,wen, hong都打不出来。
....... (2017-09-19 15:29) 

已更新,请帮忙继续测试!
离线liuyuanan

只看该作者 31楼 发表于: 2018-03-03
回 chongyong 的帖子
chongyong:哈哈  不稳不稳   我也没仔细测过 (2017-11-17 17:42) 

已更新,请帮忙继续测试!
离线liuyuanan

只看该作者 32楼 发表于: 2018-03-03
回 aahellaa 的帖子
aahellaa:tmp.append(*it);
        //尝试查询拼音
        QString sqlQueryCizu = "select [type] from [hzpy] where [pinyin]='" + tmp + "';";
   &nbs .. (2017-09-19 08:39) 

已更新,请帮忙继续测试!
离线sbaojun

只看该作者 33楼 发表于: 2018-03-06
强烈支持,
离线shutor

只看该作者 34楼 发表于: 2018-06-04
搜索词的时候消耗cpu资源很高,arm cpu频率800M,中文输入时消耗达95%左右,导致画面卡顿
离线wsz123456789

只看该作者 35楼 发表于: 2018-07-08
想学习 请问为什么我下载不了呀
离线xam786458276

只看该作者 36楼 发表于: 2018-08-25
拼音分词,我发现了一个BUG。刚开始数据库里面没有词组的情况下,你输入字母,比如我想输入“你好”,nh,它会自动分词变成 n`h 没错,但是当你选择字母 n 代表的中文选错之后,比如你选了个 年,后面的字母 h 选择 好 字,就变成 “年好” ,然后数据库里面就有 “年好” 这个词组,下次再输入 nh 之后,就只有 “年好” 这个词组出现,而 无法再选择 n和h 想表达的中文了
离线xam786458276

只看该作者 37楼 发表于: 2018-08-25
想问一下,再软件盘中如何实现输入法切换呢?我想用软件盘切换系统的输入法
离线baisetuzi

只看该作者 38楼 发表于: 2018-10-20
请教一下,最新的代码编译报错,还有之前的中文不能使用,需要将.db文件拷贝到哪里?
离线liuyuanan

只看该作者 39楼 发表于: 2019-01-13
回 xam786458276 的帖子
xam786458276:拼音分词,我发现了一个BUG。刚开始数据库里面没有词组的情况下,你输入字母,比如我想输入“你好”,nh,它会自动分词变成 n`h 没错,但是当你选择字母 n 代表的中文选错之后,比如你选了个 年,后面的字母 h 选择 好 字,就变成 “年好” ,然后数据库里面就有 “年好” 这个词 .. (2018-08-25 14:36) 

你有什么改进的思路吗?
快速回复
限100 字节
 
上一个 下一个