【更新】
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
#include
#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
#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
#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() <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