Qt输入法设计(嵌入式)

来源:互联网 发布:淘宝直播官方怎么收费 编辑:程序博客网 时间:2024/04/27 15:57

【更新】

2012-7-9,设计模式(5)-装饰模式(Decorator),运用装饰模式改进的版本

2012-6-6,设计模式(1)-模板模式,运用模板模式改进的版本

2012-5-29,添加源码示例下载地址(文章末尾)

【描述】

用QT制作了输入法,能输入英文和数字以及字符。简要介绍,示出关键代码。在QLineEdit控件和QTableWidget中均可以使用,本例只给出了QLineEdit的情况。

【效果】

单击编辑框控件,跳出输入法。如图1所示:

图1 输入法效果

图2 开发板运行效果

【原理】将QToolButton控件上的字符,传给需要输入的控件。

【简介】

先利用QT Creator设计一个键盘界面,如图2所示:

图2 设计键盘界面

以字符为'q’的按钮为例,将对象命名为toolButton_q,以此类推。

【关键代码】

keyboard.h

#ifndef  KeyBoard_H#define  KeyBoard_H#include <QtGui>#include <QSignalMapper>#include "ui_keyboard.h"enum {    iMode_Normal = 0,    iMode_Passwd = 1};namespace Ui {    class KeyBoard;}class KeyBoard : public QDialog, Ui::KeyBoard{    Q_OBJECTpublic:     KeyBoard();     ~KeyBoard();     //void mouseMoveEvent(QMouseEvent *);     //void mousePressEvent(QMouseEvent *);public:     QString text;private:     QSignalMapper *signalMapper;     QPoint dragPosition;     bool caps_Lock;     int inputMode;     bool waitingForOperand;private:     void setMapper();     void connectMapper();signals:     void setvalue(const QString &);private slots:     void onCursorRight();     void onCursorLeft();     void onCursorUp();     void onCursorDown();     void onHorizontalSliderValueChanged(int value);     void setDispText(const QString& text);     void onInvMode();     void onCapslock();     void onEnter();     void onBackspace();     void onEsc();};#endif //  KeyBoard_H


keyboard.cpp

#include <QtGui>#include "keyboard.h"KeyBoard::KeyBoard(){    setupUi(this);    setWindowFlags(Qt::Tool|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);    display->setFocus();    waitingForOperand = true;    inputMode = iMode_Normal;    caps_Lock = false;    signalMapper=new QSignalMapper(this);    setMapper();    connectMapper();    connect(signalMapper,SIGNAL(mapped(const QString&)),this,SLOT(setDispText(const QString&)));    connect(toolButton_up,SIGNAL(clicked()),this,SLOT(onCursorUp()));    connect(toolButton_down,SIGNAL(clicked()),this,SLOT(onCursorDown()));    connect(toolButton_right,SIGNAL(clicked()),this,SLOT(onCursorRight()));    connect(toolButton_left,SIGNAL(clicked()),this,SLOT(onCursorLeft()));    connect(toolButton_Inv,SIGNAL(clicked()),this,SLOT(onInvMode()));    connect(toolButton_enter,SIGNAL(clicked()),this,SLOT(onEnter()));    connect(toolButton_backspace,SIGNAL(clicked()),this,SLOT(onBackspace()));    connect(toolButton_capslock,SIGNAL(clicked()),this,SLOT(onCapslock()));    connect(toolButton_esc,SIGNAL(clicked()),this,SLOT(onEsc()));    connect(horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(onHorizontalSliderValueChanged(int)));}KeyBoard::~KeyBoard(){}/** Name : void mouseMoveEvent(QMouseEvent *event),void mousePressEvent(QMouseEvent *event)* Type : QEvent* Func : realize drag the window of keyBoard by mouse press and move* In   : QMouseEvent* Out  : Null*//*void KeyBoard::mouseMoveEvent(QMouseEvent *event){    if (event->buttons() == Qt::LeftButton)    {        move(event->globalPos() - dragPosition);        event->accept();    }}void KeyBoard::mousePressEvent(QMouseEvent *event){    if (event->button() == Qt::LeftButton)    {        dragPosition = event->globalPos() - frameGeometry().topLeft();        event->accept();    }    if (event->button() == Qt::RightButton)    {        close();    }}*//** Name : void setMapper()* Type : function* Func : mapping the toolButton text to signalMapper* In   : Null* Out  : Null*/void KeyBoard::setMapper(){    //number    signalMapper->setMapping(toolButton_0,toolButton_0->text());    signalMapper->setMapping(toolButton_1,toolButton_1->text());    signalMapper->setMapping(toolButton_2,toolButton_2->text());    signalMapper->setMapping(toolButton_3,toolButton_3->text());    signalMapper->setMapping(toolButton_4,toolButton_4->text());    signalMapper->setMapping(toolButton_5,toolButton_5->text());    signalMapper->setMapping(toolButton_6,toolButton_6->text());    signalMapper->setMapping(toolButton_7,toolButton_7->text());    signalMapper->setMapping(toolButton_8,toolButton_8->text());    signalMapper->setMapping(toolButton_9,toolButton_9->text());    //letter    signalMapper->setMapping(toolButton_a,toolButton_a->text());    signalMapper->setMapping(toolButton_b,toolButton_b->text());    signalMapper->setMapping(toolButton_c,toolButton_c->text());    signalMapper->setMapping(toolButton_d,toolButton_d->text());    signalMapper->setMapping(toolButton_e,toolButton_e->text());    signalMapper->setMapping(toolButton_f,toolButton_f->text());    signalMapper->setMapping(toolButton_g,toolButton_g->text());    signalMapper->setMapping(toolButton_h,toolButton_h->text());    signalMapper->setMapping(toolButton_i,toolButton_i->text());    signalMapper->setMapping(toolButton_j,toolButton_j->text());    signalMapper->setMapping(toolButton_k,toolButton_k->text());    signalMapper->setMapping(toolButton_l,toolButton_l->text());    signalMapper->setMapping(toolButton_m,toolButton_m->text());    signalMapper->setMapping(toolButton_n,toolButton_n->text());    signalMapper->setMapping(toolButton_o,toolButton_o->text());    signalMapper->setMapping(toolButton_p,toolButton_p->text());    signalMapper->setMapping(toolButton_q,toolButton_q->text());    signalMapper->setMapping(toolButton_r,toolButton_r->text());    signalMapper->setMapping(toolButton_s,toolButton_s->text());    signalMapper->setMapping(toolButton_t,toolButton_t->text());    signalMapper->setMapping(toolButton_u,toolButton_u->text());    signalMapper->setMapping(toolButton_v,toolButton_v->text());    signalMapper->setMapping(toolButton_w,toolButton_w->text());    signalMapper->setMapping(toolButton_x,toolButton_x->text());    signalMapper->setMapping(toolButton_y,toolButton_y->text());    signalMapper->setMapping(toolButton_z,toolButton_z->text());    //other    signalMapper->setMapping(toolButton_line1,toolButton_line1->text());    signalMapper->setMapping(toolButton_line2,toolButton_line2->text());    signalMapper->setMapping(toolButton_line3,toolButton_line3->text());    signalMapper->setMapping(toolButton_wenhao,toolButton_wenhao->text());    signalMapper->setMapping(toolButton_dot,toolButton_dot->text());    signalMapper->setMapping(toolButton_space," ");    signalMapper->setMapping(toolButton_tab,"\t");}/** Name : void connectMapper()* Type : function* Func : connect the toolButton signal(clicked()) to the signalMapper slots(map())* In   : Null* Out  : Null*/void KeyBoard::connectMapper(){    //number    connect(toolButton_0,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_1,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_2,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_3,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_4,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_5,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_6,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_7,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_8,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_9,SIGNAL(clicked()),signalMapper,SLOT(map()));    //letter    connect(toolButton_a,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_b,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_c,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_d,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_e,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_f,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_g,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_h,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_i,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_j,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_k,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_l,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_m,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_n,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_o,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_p,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_q,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_r,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_s,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_t,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_u,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_v,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_w,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_x,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_y,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_z,SIGNAL(clicked()),signalMapper,SLOT(map()));    //other    connect(toolButton_line1,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_line2,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_line3,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_wenhao,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_dot,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_space,SIGNAL(clicked()),signalMapper,SLOT(map()));    connect(toolButton_tab,SIGNAL(clicked()),signalMapper,SLOT(map()));}void KeyBoard::onCursorUp(){    QKeyEvent upPress(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);    QApplication::sendEvent(QApplication::focusWidget(),&upPress);}void KeyBoard::onCursorDown(){    QKeyEvent downPress(QEvent::KeyPress,Qt::Key_Down,Qt::NoModifier);    QApplication::sendEvent(QApplication::focusWidget(),&downPress);}/** Name : void onCursorRight()* Type : slot* Func : cursor move right* In   : Null* Out  : Null*/void KeyBoard::onCursorRight(){    display->cursorForward(false,1);}/** Name : void onCursorLeft()* Type : slot* Func : cursor move left* In   : Null* Out  : Null*/void KeyBoard::onCursorLeft(){    display->cursorBackward(false,1);}/** Name : void onHorizontalSliderValueChanged(int value)* Type : slot* Func :* In   : int* Out  : Null*/void KeyBoard::onHorizontalSliderValueChanged(int value){    horizontalSlider->setRange(0,255);    qreal opacity=(qreal)((1.0/256.0)*value);    setWindowOpacity(opacity);    lcdNumber->display(value);}/** Name : void setDispText(const QString& text)* Type : slot* Func : insert and show text on display(QLineEdit)* In   : QString* Out  : Null*/void KeyBoard::setDispText(const QString& text){    if(waitingForOperand)    {        display->clear();        waitingForOperand = false;    }    display->insert(text);}/** Name : void onInvMode()* Type : slot* Func : invert input mode* In   : Null* Out  : Null*/void KeyBoard::onInvMode(){    if(inputMode == iMode_Normal)    {        inputMode = iMode_Passwd;    }    else if(inputMode == iMode_Passwd)    {        inputMode = iMode_Normal;    }    if(inputMode == iMode_Normal)    {        display->setEchoMode(QLineEdit::Normal);    }    else if(inputMode == iMode_Passwd)    {        display->setEchoMode(QLineEdit::Password);    }}/** Name : void onCapslock()* Type : slot* Func : caps lock* In   : Null* Out  : Null*/void KeyBoard::onCapslock(){    caps_Lock = !caps_Lock;    if(caps_Lock)    {        //letter        toolButton_a->setText("A");        toolButton_b->setText("B");        toolButton_c->setText("C");        toolButton_d->setText("D");        toolButton_e->setText("E");        toolButton_f->setText("F");        toolButton_g->setText("G");        toolButton_h->setText("H");        toolButton_i->setText("I");        toolButton_j->setText("J");        toolButton_k->setText("K");        toolButton_l->setText("L");        toolButton_m->setText("M");        toolButton_n->setText("N");        toolButton_o->setText("O");        toolButton_p->setText("P");        toolButton_q->setText("Q");        toolButton_r->setText("R");        toolButton_s->setText("S");        toolButton_t->setText("T");        toolButton_u->setText("U");        toolButton_v->setText("V");        toolButton_w->setText("W");        toolButton_x->setText("X");        toolButton_y->setText("Y");        toolButton_z->setText("Z");        toolButton_line1->setText("<");        toolButton_line2->setText(">");        toolButton_line3->setText("-");        toolButton_dot->setText("*");        toolButton_wenhao->setText("#");    }    else    {        //letter        toolButton_a->setText("a");        toolButton_b->setText("b");        toolButton_c->setText("c");        toolButton_d->setText("d");        toolButton_e->setText("e");        toolButton_f->setText("f");        toolButton_g->setText("g");        toolButton_h->setText("h");        toolButton_i->setText("i");        toolButton_j->setText("j");        toolButton_k->setText("k");        toolButton_l->setText("l");        toolButton_m->setText("m");        toolButton_n->setText("n");        toolButton_o->setText("o");        toolButton_p->setText("p");        toolButton_q->setText("q");        toolButton_r->setText("r");        toolButton_s->setText("s");        toolButton_t->setText("t");        toolButton_u->setText("u");        toolButton_v->setText("v");        toolButton_w->setText("w");        toolButton_x->setText("x");        toolButton_y->setText("y");        toolButton_z->setText("z");        toolButton_line1->setText("/");        toolButton_line2->setText("\\");        toolButton_line3->setText("_");        toolButton_dot->setText(".");        toolButton_wenhao->setText("?");    }    setMapper();}/** Name : void onEnter()* Type : slot* Func : enter and emit the signal to editor to set text* In   : Null* Out  : Null*/void KeyBoard::onEnter(){    waitingForOperand = true;    text = display->text();    emit setvalue(text);    display->clear();    this->close();}/** Name : void onEsc()* Type : slot* Func : Esc* In   : Null* Out  : Null*/void KeyBoard::onEsc(){    display->clear();    text.clear();    this->close();}/** Name : void onBackspace()* Type : slot* Func : backspace* In   : Null* Out  : Null*/void KeyBoard::onBackspace(){    display->backspace();}


inputmethod.h

#ifndef INPUTMETHOD_H#define INPUTMETHOD_H#include "keyboard.h"class InputMethod:public KeyBoard{    Q_OBJECTpublic:    InputMethod();    ~InputMethod();    bool eventFilter(QObject *obj, QEvent *event);public:    KeyBoard *keyboard;public:    void showKeyBoard();signals:    void setImObjName(QString);};#endif // INPUTMETHOD_H


inputmethod.cpp

#include <QDebug>#include "inputmethod.h"InputMethod::InputMethod(){    keyboard = new KeyBoard;    setWindowFlags(Qt::Tool|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);}InputMethod::~InputMethod(){    delete keyboard;}/** Name : void eventFilter(QObject *obj, QEvent *event);* Type : QEvent* Func : judge input method event* In   : QObject,QEvent* Out  : bool*/bool InputMethod::eventFilter(QObject *obj, QEvent *event){    if(event->type()==QEvent::MouseButtonPress)    {        emit setImObjName(obj->objectName()); //send the Object Name of event to judge who trigger it        //qDebug() <<obj->objectName();        showKeyBoard();        return true;    }    return QObject::eventFilter(obj,event);}/** Name : void showKeyBoard();* Type : function* Func : show keyBoard* In   : Null* Out  : Null*/void InputMethod::showKeyBoard(){    keyboard->setWindowFlags(Qt::Tool|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);    keyboard->move(50,120);    keyboard->exec();}

 

【使用方法】

以QLineEdit为例说明:

(1) 首先,在需要输入法的控件文件中包含inputmethod.h文件;

#include "inputmethod.h"

(2) 创建输入法对象

im = new InputMethod;

(3) QLineEdit对象添加事件机制

managerEdit->installEventFilter(im);passwdEdit->installEventFilter(im);managerEdit->setObjectName("managerEdit");passwdEdit->setObjectName("passwdEdit");connect(im,SIGNAL(setImObjName(QString)),this,SLOT(createImConnect(QString)));//connect the input method


该方法是通过判断对象名,实现在不同控件中切换。所以一定要给对象命名。

(4) 槽函数createImConnect(QString ObjName)的编写

void QLogin::createImConnect(QString ObjName){    disconnect(im->keyboard,SIGNAL(setvalue(QString)),passwdEdit,SLOT(setText(QString)));    disconnect(im->keyboard,SIGNAL(setvalue(QString)),managerEdit,SLOT(setText(QString)));    if(ObjName=="managerEdit")    {        connect(im->keyboard,SIGNAL(setvalue(QString)),managerEdit,SLOT(setText(QString)));    }    else    {        connect(im->keyboard,SIGNAL(setvalue(QString)),passwdEdit,SLOT(setText(QString)));    }}

 

【示例下载地址】

 http://download.csdn.net/detail/tandesir/4337488(有多个版本,个人推荐的版本http://download.csdn.net/detail/tandesir/4378244)

(2012-6-3)

*该资源是针对嵌入式开发板的版本,只能输入英文和数字,以及少数的符号。虽然可以跨平台运行,但基于X86系统是不合适的,至少不会获得良好的用户体验,好像只是界面交互。上传资源只是为了学习交流,如果是为了做基于Windows XP的输入法,参考价值不大。

*CSDN的<资源>功能,无法修改,也无法删除。上传资源者请慎重,至少去掉个人信息。希望CSDN可以赋予用户对资源修改、删除的权限。

 

【写在最后】 

看到他人对资源的评论,觉得很有趣。有人说是界面交互。有人说是短信机。严格来讲,这确实不能和PC机上输入法相比,原因如下:

(1) 只能输入少数英文字符;

(2) 关联特定的控件(见设计模式(1)-模板模式(Template),个人推荐这个版本);

(3) 没有事先预置的词库。

但我认为这种做法,在嵌入式平台还是有价值的。其一,它占用很少的资源;其二,确实能有效的实现英文的输入。可以说是界面交互。但短信机的称呼就不正确,因为没有实现发短信的功能,如果有必要可以加上,呵呵。

 

 

转载请标明出处,仅供学习交流,勿用于商业目的

Copyright @ http://blog.csdn.net/tandesir

 

 




 

 

 

 

原创粉丝点击