您的位置:首页 > 编程语言 > Qt开发

QT 嵌入式 输入法 软键盘

2015-04-22 12:11 337 查看
设计自己的输入法需要继承QWSInputMethod。

需要重新实现:

    virtual void updateHandler ( int type );    

//type值是枚举变量Update, FocusIn, FocusOut, Reset, Destroyed

分别对应:拥有焦点的控件发生变化(例如QLineEdit的位置发生变化),需要输入法做出相应的改变(软键盘位置)

         新控件开始拥有焦点。(需要弹出输入法)

         原有控件失去焦点(需要关闭输入法)

         重启输入法(可以在系统语言发生变化时,重新配置输入法)

         输入法销毁(基本用不到)
void MyInputMethod::updateHandler(int type)
{

switch(type)
{
case Update:
//update输入法widget
break;
case FocusIn:
{
//输入控件获得焦点时,启动输入法
QWidget *focusWidget = QApplication::focusWidget();
if(focusWidget && focusWidget->focusPolicy()==Qt::StrongFocus &&mActive ==false)
{
//弹出输入法相关的widget
ShowKeyBoard();
}
}
break;
case FocusOut:
if(mActive)
{
//关闭输入法相关的widget
}
break;
case Reset:
//reset inputmethod
break;
case Destroyed:
break;
}
}


不同用户的KeyBoard实现方法不一样,同时在Keyboard中继承相应的输入法。英文软键盘可参考:
http://blog.csdn.net/tandesir/article/details/7283158#comments
另外,再实现2个槽函数,用于接受软件盘或者输入法输出的字符(假如当用户按键A后,字母A需要被MyInputMethod知道)
void MyInputMethod::CommitCharacter(QString str)
{
//将文字送入输入框内
JYZ_PrintLog("%s",str.toLocal8Bit().constData());
if(str.length()==0 && mPreEditString.length())
sendCommitString(mPreEditString);
else
sendCommitString(str);
mPreEditString.clear();
if(mInputmethodPanel)
mInputmethodPanel->Reset();
}
void MyInputMethod::PreeditCharacter(QString str)
{
//将候选送入输入框内,同时显示下滑线
mPreEditString=str;
sendPreeditString(str,0);
}


为了让得到的字符或者字符串显示到编辑框中可以使用 sendCommitString和sendPreeditString

CommitString和PreeditString的区别是什么?

在T9输入法中,输入数字2得到字母a,再输入数字2得到字母b。a和b显示时带有下划线且闪烁。这是调用sendPreeditString实现的。PreeditString,顾名思义预编辑的。

当连续2次输入数字2后,等待一段时间后,PreeditString 'b'需要变为CommitString 'b'。这是调用sendCommitString实现的。

上面3个函数实现后,整个输入法的框架也就搞定了。剩下的就是:如何显示键盘,如何绑定输入法并输出正确的PreeditString和CommitString了。

当然,为了让QT运行时能够识别,需要进行注册:

QWSServer::setCurrentInputMethod(new MyInputMethod());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: