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
- Qt输入法设计(嵌入式)
- Qt输入法设计(嵌入式)
- 嵌入式输入法的设计
- QT 嵌入式 输入法 软键盘
- 嵌入式系统中文输入法的设计
- 嵌入式系统中文输入法的设计
- 嵌入式系统中文输入法的设计
- qt的嵌入式平台输入法:SYSZUXpinyin移植到arm
- 嵌入式系统中文输入法的设计(一)
- 嵌入式系统中文输入法的设计(二)
- 嵌入式系统中文输入法的设计(三)
- 嵌入式系统中文输入法的设计(四)
- 嵌入式QT环境搭建及设计1
- 基于Qt/Embedded的嵌入式GUI设计
- 基于Qt嵌入式媒体播放器系统设计
- 基于PXA255和嵌入式QT的IP视频电话设计
- 嵌入式Linux中基于 Qt/Embeded触摸屏驱动的设计
- 基于Qt的嵌入式媒体播放器系统的设计
- 给定一个整数,求其二进制数中1的个数
- strcpy的一个小bug
- c++pri 2/22--字面值常量
- 浅谈IBM UNIX服务器的逻辑分区(LPAR)
- 浅谈如何学习DSP软件开发
- Qt输入法设计(嵌入式)
- 六种方式实现hibernate查询,及IDE推荐
- 统计大文件中的中文字符、英文字符、数字及其他字符的数量
- 让听得见炮声的人来呼唤炮火——研发管理的两种理论之辩
- jQuery Ajax 实例 全解析
- Eclipse下修改部署工程名
- 虚拟化技术的分类
- EdgeRank杂谈
- 调整android dialog对话框显示位置