新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于Murphypinyin的嵌入式键盘设计

基于Murphypinyin的嵌入式键盘设计

作者:时间:2014-11-23来源:网络收藏

  2.2 Qt/Embedded的键盘映射

本文引用地址:http://www.eepw.com.cn/article/265782.htm

  Qt/Embedded是Trolltech公司针对采用嵌人式的电子设备开发的综合应用平台。Qt/Embedded包含完整的应用层、灵活的用户界面、窗口操作系统、应用程序以及开发框架。

  Qt/Embedded 本身提供了对按键的支持,它在文件qkeyboard_qws.cpp中提供了一个QWSKeyboardHandler类来处理按键事件。本系统创建了 QWSKeyboardHandler类的一个子类QWSKEYMATRIXHandler。在QWSKEYMATRIXHandler类的构造函数中,通过open()函数打开矩阵键盘key_matrix,通过对打开的键盘设备创建一个QscoketNotifer来监控按键设备,通过信号与槽机制,建立该QscoketNotifer与读键盘函数ReadKeyboardData()的连接,当key_matrix被激活时,就会触发读键盘函数 ReadKeyboardData()。代码如下:

  notifier=new QSocketNotifier(key_matrix,QSock-etNotifier::Read,this);

  connect(notifier,SIGNAL(activated(int)),this,SLOT(ReadKeyboardData()));

  在读键盘函数ReadKeyboardData()中,调用矩阵键盘驱动程序的读函数Read()来获取按键值。为了使得按键值能够传送给应用程序,要使用 QWSKeyboardHandler类的成员函数processKeyEvent(int unicode,int keycode,int modifiers,bool isPress,bool autoRepeat),各参数功能如下:

  ①Unicode:按键的Unicode编码,如数字1的unicode编码为1,字母A的unicode编码为A。如果该项为0,则为功能键Shift、Left、Right等;如果该项为0xFFFF,则只传送键值keycode,不打印编码。

  ②Keycode:Qt中使用的按键名称,如Qt::Key_Backspace、Qt::Key_Enter等。

  ③Modifiers:Qt所支持的键盘组合键。

  ④isPress:判断按键的状态是“按下”还是“弹起”。

  ⑤autoRepeat:判断本次事件是有自动重复机制产生,还是由一个现实中的按键产生。

  通过processKeyEvent()函数可以发送数字、小写英文、大写英文,但是目前Qt/Embedded上没有中文输入法,不能输入中文。

  2.3 Murphpinyin拼音输入法的移植

   是目前为止基于Qt/Embedded的一个比较好的开源中文输入法,而且带有软键盘,用户可以通过触摸屏输入中文、英文、数字和符号等。对于到Qt/Embedded的移植,网络上有很多参考资料,这里不再作介绍。

  但是将 Murphypinyin应用到手持终端上目前还有一个问题:Murphypinyin带有的软键盘是标准的PC101键盘,按键数量很多。在对体积、重量要求很苛刻的手持终端上,触摸屏本身的尺寸受到严重的制约,PC101键盘会占据触摸屏的大部分显示面积;而且单个按键所占面积很小,从而对触摸屏的定位精度要求很高。然而触摸屏本身受周围环境的影响较大,很容易造成定位不准。本系统将矩阵键盘映射到Murphypinyin上,通过矩阵键盘输入中文、英文和数字,这样在手持终端上可以使用普通的LCD,从而降低了系统成本、提高了系统的可靠性。

  首先考虑的问题是:如何用键盘打开Murphypinyin输入法?这里可以修改Murphypinyin软件包中的PinyinFrame.cpp文件中的:

  boot QPinyinFrame::filter(int unicode,int keycode,int modifiers,bool isPress,bool autoRepeat)

  其中:if(!isHidden()&& isPress)语句用来判断Murphypinyin输入法是否已经打开并且有按键按下。如果是,则判断当前是中文模式、还是英文模式。中文模式则调用 GetKey(unicode,keycode)函数,根据输入的拼音搜索汉字;英文模式则调用SendKey(unicode,keycode)函数发送大写或小写英文字母。如果unicode==9&&keycode==Qt::Key_Tab,则进行中英文切换。在这里可以添加判断语句:if(keycode==Qt::Key NumLock)。当NumLock按键按下时,调用:QPinyinFrame::sizeHint()和QPinyinFrame::show()两个函数来开启Murphypinyin输入法界面。如果再次按下NumLock按键,则调用QPinyinFrame::hide()来隐藏输入法界面。

  用键盘打开Murphypinyin输入法之后,可以通过键盘发送拼音字母来输入汉字。通过发送unicode=9&&keycode==Qt::Key_Tab来进行中英文切换。

  2.4按键复用

  由于手持终端设备对自身的体积有严格的要求,为了缩小键盘的体积,本系统模仿手机键盘的布局,采用按键复用的方式来缩小键盘大小。将26个英文字母按字母表顺序3个或4个一组依次排列在2~9这8个数字键上,并与阿拉伯数字进行复用(见图2)。

  硬件上的简化必然导致软件复杂度的增加。为了使得系统能够在按下一个按键后自动识别是数字、英文大写字母、英文小写还是拼音字母,需要修改 Qt/Embedded中qkeyboard_qws.cpp的QWSKEYMATRIXHandler::ReadKeyboardData()函数。

  当有按键按下后,首先需要判断当前是处于何种模式:数字、拼音、小写英文还是大写英文模式,实现流程如图5所示。通过NumLock按键和状态标志字 English-Mode来进行数字状态和其他几个状态的切换。通过Tab按键来进行中、英文模式的切换,通过CapsLock按键来进行英文大小写字母的切换。

  为了使一个按键能够输入不同的字符,本系统使用不同的key_ID值来标识各个字符,这样,每按一次键都是不同的。图6是对于按键2的复用过程。根据不同的key_ID结合当前所处的输入模式,发送相应的数字、小写英文或大写英文字符。



  3 总 结

  本文介绍了基于S3C2440的矩阵键盘的硬件设计方法和软件的驱动开发方法,通过将Murphpinyin开源软件包与Qt/Embeded自带输入法的融合,使用按键复用的策略,采用较少的按键,构建了一款可输入数字、中/英文的嵌入式键盘,并在S3C2440上实现。为手持终端提供了一种嵌入式键盘的解决方案。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程



上一页 1 2 下一页

关键词: Murphypinyin Linux

评论


相关推荐

技术专区

关闭