设计了一种小巧的、具有良好的移植性和扩展性的系统级拼音输入法,企业应用表明,能够满足产品中文输入的要求。
0引言
随着嵌人式系统在信息家电、移动通信、手持设备以及工业控制等众多领域的广泛应用,国内用户对支持中文输入法的轻量级GUI的需求日益迫切。
Qt/E是Nokia公司发布的面向嵌人式系统的Qt版本,正日益成为嵌入式GUI开发的主流,被越来越多的国内外厂商用于便携式电子设备的开发,然而它并没有提供中文输入法。目前国内在Qt/E平台下开发的中文输入法主要有2种方式:
1)移植现有的PC机系统下的基于Qt/X11的中文输人法,移植了基于XWindow下的XIM输入协议的中文输入法,但其需要XWindow下Xlib库的支持,这将增大系统开销,减慢显示的速度。
2)使用Qt/E插件的方法,其需要一个桌面应用管理程序,一般移植Qt/E自带的qpe桌面管理程序来管理输入法,这将给不需要桌面管理的设备带来额外的开销。
基于此,本文开发了一种Qt/E平台下的小巧的中文输入法,在不增加系统开销也不影响移植性和扩展性的前提下,使用户可以方便地输人中文、英文及各种字符,并根据项目实际需要,设定输出汉字的字体和大小,可减小应用程序开发的难度和复杂度。
1Qt/E的体系结构与输入法设计原理
Qt/E和Qt/Xl1是Nokia公司开发的面向嵌入式系统和Pc机的不同Qt版本。Qt/E与Qt/X11最大的区别就在于它们所依赖的底层显示基础的不同,这也就导致了它们在体系结构上的差异。对于Qt/Xl1来说,底层的显示技术构建在xWindowSystem之上,完全依赖于XWindowSystem。
Qt/E在这方面则完全不同,它并没有构建在xWindowSystem之上,而是构建在Linux的FrameBuffer之上,把需要在界面上显示的内容直接写入FrameBuffer。因为在嵌入式系统上把XSystem给省略了,可以节省许多的系统开销。而直接写FrameBuffer,又会加快显示速度。Qt/E与Qt/Xl1体系构架对比见图1。
图1Qt/E和Qt/X11体系构架对比
这一改变,导致了在Qt/E多出了1个Server层,该层负责监听系统事件,尤其是键盘和鼠标事件、屏幕输出、管理注册、管理顶层窗口等诸多功能。系统产生的键盘鼠标事件,首先就传给了这个Server层,然后Server层在根据具体的情况把这些事件分发给相应的应用程序。
每一个Qt/E应用程序都需要一个这样Server层存在]。所以,第1个运行起来的Qt/E应用程序就会启动这个Server层并让自己成为这个Server进程,后续运行的程序就会连接到这个Server层来管理自己。在Server端,每一个连接到Server层的Client都有一个QWSClient对象与之对应,这个对象主要记录了ClientID。在应用程序中每创建一个顶层窗口,那么在Server端就会有创建一个QWSWindow实例来与之对应。
当Server收到一个Event时,它需要判断应该发送给哪个窗口,这时候,它就会从QWSWindow列表中去找,然后根据这个窗口去找对应的Client应用程序,最后用QWSEvent对象来包装这个Event。
通过Socket机制发送给具体的Client应用程序。
基于以上原理,为了设计一个系统级中文输入法,需要把输入法的设计放在Server层上。具体来说,就是把输入法写为Server层的一部分,作为Server进程运行。
如果当前系统Server层安装了一个输入法,那么每次键盘事件产生的时候,就会先送给输入法,让输入法来做判断,看输入法是否会处理这个键盘按键,如果输入法可以处理,就不再继续分发这个事件,否则就会按照原先的事件分发机制继续分发这个事件。输入法会在应用程序之前处理键盘事件并根据用户选择发送相应汉字到客户端应用程序。
Qt/E拼音输入法的客户/服务器模型见图2。
图2Qt/E拼音输入法的客户/服务器模型
2中文输人法的设计与实现
Qt/E2。3版本提供了针对亚洲语系双字节输入法支持。可通过继承QWSInputMethod类构造输入法实例,其接受的按键事件既可以来自于物理键盘,也可以从虚拟键盘产生,QWSInputMethod类提供键盘过滤器拦截按键消息,根据用户所选择的输入法,输出相应的字符到目标程序。
2。1拼音输入法的功能
本输入法的界面见图3。当单击软键盘上面的输入法按键时,系统弹出软键盘面板,若选择中文输入法,则首先检测输入的按键组合是否是正确的拼音组合,如果是,将该拼音组合显示在拼音输入框中。接下来将匹配的汉字显示到汉字显示框,汉字显示框每页允许显示1O个汉字,如果没有所需汉字,可以通过翻页键翻页查找。找到所需汉字后,单击相应的数字键,即可将相应汉字输入到当前应用程序的输入窗口中。随后,汉字显示框将继续显示下一页供用户继续选择输入。
2。2输入法窗口的设计
输入法窗口由中英文切换键、拼音输入框、汉字显示框和软键盘组成,软键盘的按键类PushBut-ton继承自Qt的QToolButton类。
当按键被按下时发送信号keyPress,由信号keyPress触发sendKey槽来实现拼音输入框显示。
connect(btn,SIGNAL(keyClick(Qt::Key)),this,SLOT(sendKey(Qt::Key,bool,boo1))
当拼音输入框变化时会触发汉字显示框的变化,由textChanged信号触发change槽,显示汉字。
connect(inpyLineEdit,SIGNAL(textChanged(constQString&)),this,SLOT(change(c')nstQString&)))
在这个软键盘中,共需要实现拼音、英文大小写、各种符号及一般的功能按键,其键盘的布局设计在QtDesigner中,由于嵌入式系统显示屏大小的关系,需要一键多用,所以本文通过读取XML文档的方式来显示按键上的text文本。例如:0键对应序号为nr="15",初始化时PushButton0键text设置为"0",当按下shift时,text设置为"!",按下shift时text设置为"0",keycodeI,2,3为Qt::Key值,XML文档格式如下:
图3软键盘界面
软键盘左上角的CheckBox用于中英文切换,选中时,输人中文,不选时输入的则是英文,在英文输入时,若按下Caps键软键盘面板上的数字键,切换成常用符号,英文全变成大写。1-r按键是本输入法的特色,按下1-r键可以选择需要输出汉字的字体和大小,其余的按键功能同Pc机键盘。
因为没有桌面管理程序,本文还设计了一个置顶的浮动框,用于打开软键盘。当点击输入法按键时,弹出软键盘。
2。3输入法设计
Qt/E输入法基类为QWSInputMethod,在这个基类中定义了一些接口用以支持输入法程序设计,并从QWSInputMethod这个类继承出一个输入法类,在这个类中处理键盘和鼠标事件,把接收到的键盘事件按照输入法的编码规则转换为对应的中文,一个汉字,或者是一个中文短语,并把最终用户的选择发送到当前编辑窗口。
1nputMethod类继承QWSInputMethod类来实现输入法的处理,在这里实现的几个主要的接口函数有:
virtualboolfilter(intunicode,intkeycode,intmodifiers,bootisPress,boolautoRepeat)
这个接口的作用就是过滤键盘事件,在这个函数中处理键盘输人,并且根据相应的输人法方法把键盘输入转换为相应的中文。
voidsendc0mmitstring(constQString&eommitString,intrepIaceFromPosi"on:0,intreplaceLength=0)
这个接口函数表示把相应的字符串发送到当前编辑窗口,一般用于在用户作出最终的选择之后,把相应的字符串发送出去。
voidsel1dPreeditsng(constQString&preeditString,inteursorPosition,intselectionLength=0)
把当前正在编辑的字符串发送给当前编辑窗口。
为了使输入法成为系统级输入法,在这个类中还需要实现输入法安装/卸载函数,这样系统中才会有全局的输人法模块,输入法才能工作。
install和release输入法的函数,就是通过调用QWSServer类中的成员函数来实现的。QWSServer::
setCurrentInputMethod这个函数为当前的Qt/E安装一个输入法,如设置拼音输入法:
QWSServer::setcurrentInputMeth0d(pinyin)
如果把参数设置为NULL,就是卸载输入法。输入法安装完成之后,输入法类中就可以接收到键盘事件了,拼音输入法的具体流程见图4。
图4拼音输入法按键处理流程
最终拼音输入法在三星S3C2440平台上运行的界面见图5。
图5运行结果
3结语
本文基于三星S3C2440平台,实现了基于Qt/E4。5的拼音输入法,并重点阐述了Qt/E的中文输入法原理,在这个基础上可以比较容易地开发出其他的中文输入法。