查看完整版本: [-- 支持中文输入的虚拟键盘输入法 --]

QTCN开发网 -> Qt 作品展 -> 支持中文输入的虚拟键盘输入法 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liuyuanan 2017-03-17 21:45

支持中文输入的虚拟键盘输入法

声明:
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.我特别鄙视那种只取别人的成果又不贡献自己劳动成果的人!如果你是这种人,请不要窃取我的劳动成果!!


进入正题,软件运行效果图:
[attachment=16678]




源码:[attachment=16661]

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

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

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


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

软件运行效果图:
拼音自动分词效果:
[attachment=16678]



词组输入效果1:
[attachment=16679]



词组输入效果2:
[attachment=16680]



源码:
[attachment=16681]

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


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

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

词组输入效果1:
[attachment=18518]

词组输入效果2:
[attachment=18517]

词组输入效果3:
[attachment=18520]



源码:
[attachment=18519]




liudianwu 2017-03-18 09:25
看了下。超过9.9成代码一模一样!函数命名,参数结构,注释,完全一致!鉴定完毕!

liuyuanan 2017-03-18 14:47
liudianwu:看了下。超过9.9成代码一模一样!函数命名,参数结构,注释,完全一致!鉴定完毕![表情]  (2017-03-18 09:25) 

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

nigoole 2017-03-18 21:44

liudianwu 2017-03-19 13:27
liuyuanan:[表情]刘大侠,我开篇就说了是在你的代码基础上修改的,我只是加入中文输入而已。上传的目的是让大家共同学习! (2017-03-18 14:47) 

我只是看到你把我双拼查询的那行代码注释了,改成了单拼哦!这是我看到的唯一一行不同的代码!其他完全一致哦!

liuyuanan 2017-03-19 15:58
liudianwu:我只是看到你把我双拼查询的那行代码注释了,改成了单拼哦!这是我看到的唯一一行不同的代码!其他完全一致哦! (2017-03-19 13:27) 

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

zhenonline 2017-03-20 00:07
中文出不来

t1029901995 2017-03-20 10:00
中文出不来

liuyuanan 2017-03-20 22:54
zhenonline:中文出不来
 (2017-03-20 00:07) 

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

liuyuanan 2017-03-20 22:54
t1029901995:中文出不来 (2017-03-20 10:00) 

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

lishaoguang5 2017-06-17 20:19
                    

梦寻未央 2017-07-14 15:04

aahellaa 2017-08-25 17:11
感谢各位高手,学习一下,很实用的程序,

aahellaa 2017-08-28 17:19
感谢刘大侠和版主的源代码,我看了后修正了一下版主修改后的自动分词功能,修改后分词能力有一定的改善,就是在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 2017-09-02 21:11
[attachment=17783]

12345654321 2017-09-08 15:22
大神,有没有研究过QT自带的虚拟键盘中文输入法?若有的话,怎样改中文输入法的备选词的字体大小?求大神指导下,万分感谢,感激不尽!!

aahellaa 2017-09-14 17:21
liudianwu:
[图片]


aahellaa 2017-09-14 17:24
我测试了下没问题啊。        
//尝试查询拼音
        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 2017-09-19 08:39
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 2017-09-19 15:29
你好,楼主。
我发现一个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 2017-10-16 13:58
liuyuanan:[表情]刘大侠,我开篇就说了是在你的代码基础上修改的,我只是加入中文输入而已。上传的目的是让大家共同学习! (2017-03-18 14:47) 

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

dubuzherui 2017-10-31 18:35
    

seuraa 2017-11-15 15:54
  刚好用到了 谢谢

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

老哥 稳

chongyong 2017-11-17 17:42
seuraa:老哥 稳 (2017-11-15 15:55) 

哈哈  不稳不稳   我也没仔细测过

hc976865965 2017-11-27 14:40
运行完不是输入法的这个界面啊

wfwjp 2017-12-20 11:47
  
怎么修改下,只是用于某一个弹出窗口的一个lineedit啊?

berkley 2018-01-03 13:31
真心点赞,输入法现在刚好能用到,帮大忙了

pipipipapapa 2018-01-09 14:16
为什么我把数据库文件放到了bin目录下还是没有中文呢

pipipipapapa 2018-01-23 11:37
你好,怎么让输入的时候,lineedit这些控件一直有光标闪烁呢,现在是一输入,光标就不见了,这么让光标一直存在呢

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

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

liuyuanan 2018-03-03 15:24
chongyong:哈哈  不稳不稳   我也没仔细测过 (2017-11-17 17:42) 

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

liuyuanan 2018-03-03 15:24
aahellaa:tmp.append(*it);
        //尝试查询拼音
        QString sqlQueryCizu = "select [type] from [hzpy] where [pinyin]='" + tmp + "';";
   &nbs .. (2017-09-19 08:39) 

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

sbaojun 2018-03-06 17:49
强烈支持,

shutor 2018-06-04 10:53
搜索词的时候消耗cpu资源很高,arm cpu频率800M,中文输入时消耗达95%左右,导致画面卡顿

wsz123456789 2018-07-08 11:06
想学习 请问为什么我下载不了呀

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

xam786458276 2018-08-25 15:37
想问一下,再软件盘中如何实现输入法切换呢?我想用软件盘切换系统的输入法

baisetuzi 2018-10-20 14:08
请教一下,最新的代码编译报错,还有之前的中文不能使用,需要将.db文件拷贝到哪里?

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

你有什么改进的思路吗?

fjydpf 2019-04-15 17:31
不错,谢谢分享~~~

mingkeyu 2020-03-20 15:44
刚刚用到,谢谢!

welljaytse 2024-01-02 11:04
一下载就文件错误?


查看完整版本: [-- 支持中文输入的虚拟键盘输入法 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled