• 3873阅读
  • 24回复

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

上一主题 下一主题
离线liuyuanan
 

声明:
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) 下载次数:281


重要更新:

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) 下载次数:306



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

只看该作者 1楼 发表于: 03-18
看了下。超过9.9成代码一模一样!函数命名,参数结构,注释,完全一致!鉴定完毕!
离线liuyuanan

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

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

只看该作者 3楼 发表于: 03-18
有句话说得好:好好学习,天天向上。加油~~!
在线liudianwu

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

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

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

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

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

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

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

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

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

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

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

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

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

只看该作者 13楼 发表于: 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楼 发表于: 09-02
离线12345654321

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

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

离线aahellaa

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

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

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

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

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

老哥 稳
在线chongyong

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

哈哈  不稳不稳   我也没仔细测过
快速回复
限100 字节
 
上一个 下一个