【更新】
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_OBJECT public: 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_OBJECT public: 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