前言

软键盘在嵌入式平台开发中被广泛使用
本章代码功能:
1.支持中英双语输入法
2.同时支持QT4/QT5版本
3.支持linux/windows系统

源码地址

https://gitee.com/jiang_bin_yu/softkeyboard

软件功能预览

英文输入法
中文输入法

键盘代码展示

一、设置窗口大小信息

二、加载中文
2.1初始化读取字库表

bool SoftKeyBoard::InitChinese()
{QFile file(":/keyboard/SoftKeyBoard/FontLibrary.txt");int i = 0;if(file.open(QIODevice::ReadOnly)){QString str;QString key;while (true){str = file.readLine();if(str.size() < 4)break;key = str.mid(2,str.size() - 3).replace("\r","");m_map_[key].push_back(str.left(1));++i;}file.close();return true;}return false;
}

2.2 查询中文字库表

void SoftKeyBoard::ShowChinese(QString str,int page,int pos)
{qDebug()<<"ShowChinese"<<str<<page<<pos<<"current"<<m_strPingying_<<m_currentPage_<<m_currentPos_;if(page < 0)page = 0;if(pos < 0 || pos > 11)pos = 0;std::map<QString,std::vector<QString> >::iterator it = m_map_.find(str);ui.lab_pinying_->setText(str);if(it != m_map_.end() && it->second.size() < page * 12)//没有下一页return;for(int i = 0;i < 12;++i){qDebug() << (it != m_map_.end()) << m_map_.size();m_btns_[46 + i]->setText(it != m_map_.end() && it->second.size() > page * 12 + i ? it->second[page * 12 + i] : "");//qDebug()<<"on_btn_language__clicked"<<m_btns_[46 + i]->text()<<i;}if(m_btns_[46 + pos]->text().isEmpty())pos = m_currentPos_;m_strPingying_ = str;m_currentPage_ = page;m_currentPos_ = pos;
}

三、避免QLineEidt焦点丢失
3.1重写QLineEdit

void focusLineEdit::focusInEvent(QFocusEvent *e)
{QLineEdit::focusInEvent(e);this->setFocus();//qDebug() << "focusInEvent";emit focusIn();
}

3.2在键盘中connect绑定光标进入信号

 //设置光标进入 否则进入页面lineEdit 可能无法获取光标connect(ui.wordShow,SIGNAL(focusIn()),this,SLOT(OnfocusIn()));   

3.3在键盘中赋予lineEidt光标位置已经焦点

void SoftKeyBoard::OnfocusIn()
{qDebug() << "OnfocusIn";ui.wordShow->setCursorPosition(ui.wordShow->text().size());ui.wordShow->activateWindow();ui.wordShow->setFocus();// this->activateWindow();
}

四、键盘总在窗口底部显示

bool SoftKeyBoard::event(QEvent *e)
{switch (e->type()){case QEvent::WindowActivate:if (m_lastFocusedWidget_)m_lastFocusedWidget_->activateWindow();break;case QEvent::Show:{QDesktopWidget* desktop = QApplication::desktop(); // =qApp->desktop();也可以int centerHeight = (desktop->height() - FatherHeight)/2 + FatherHeight;this->move((desktop->width() - this->width())/2,m_bIsChinese_ ? centerHeight-KeyboardHeightChinese : centerHeight-KeyboardHeightEnglish);break;}default:break;}return QWidget::event(e);
}

五、中英文输入法切换时调整键盘大小以及显示位置

void SoftKeyBoard::on_btn_language__clicked()
{static bool bFirstInit = true;if(m_bIsUppercase_)on_btn_caplock__clicked();m_bIsChinese_ = !m_bIsChinese_;if( bFirstInit && m_bIsChinese_)qDebug()<<"on_btn_language__clicked"<<"open chinese.txt failed.";ui.btn_language_->setText(m_bIsChinese_ ? "中文/英文" : "英文/中文");m_bIsChinese_  ? ui.widget_chinese_->show() : ui.widget_chinese_->hide();//ui.widget_keyboard_->move(0,m_bIsChinese_ ? 100 : 2);resize(KeyboardWidth,m_bIsChinese_ ? KeyboardHeightChinese : KeyboardHeightEnglish);QDesktopWidget* desktop = QApplication::desktop(); // =qApp->desktop();也可以int centerHeight = (desktop->height() - FatherHeight)/2 + FatherHeight;this->move((desktop->width() - this->width())/2,m_bIsChinese_ ? centerHeight-KeyboardHeightChinese : centerHeight-KeyboardHeightEnglish);
}

使用键盘方法

参考文章:QT事件处理–notify()

一、利用notify函数捕获控件按下实际弹出输入框
捕获到按钮事件后判断被按下的对象名 如果对象的objectName包含lineEidt则判断需要弹出键盘

bool MyApplication::notify(QObject *receiver, QEvent *e)
{if(e->type() == QEvent::MouseButtonPress)  //receiver->parent() != NULL &&{QMouseEvent *mouseEvent=static_cast<QMouseEvent *>(e);if(receiver != NULL){qDebug() << receiver->objectName();if(receiver->objectName().contains("lineEdit")){if(static_cast<QLineEdit *>(receiver)->isEnabled()){SoftKeyBoard keyBoard;QString text = static_cast<QLineEdit *>(receiver)->text();keyBoard.setValue(text);int key = keyBoard.exec();if(key == QMessageBox::Ok){QString text = keyBoard.getValue();static_cast<QLineEdit *>(receiver)->setText(text);}return QApplication::notify(receiver, e);}}}}return QApplication::notify(receiver, e);
}

二、利用控件槽函数弹出键盘

如QTextEdit控件可以监控selectionChanged信号

void MainWindow::on_textEdit_selectionChanged()
{qDebug() << "on_textEdit_selectionChanged";SoftKeyBoard keyBoard;int key = keyBoard.exec();if(key == QMessageBox::Ok){QString text = keyBoard.getValue();ui->textEdit->append(text);}
}

如Tablewidget控件可以监控itemDoubleClicked信号即双击item时弹出键盘

void MainWindow::on_tableWidget_itemDoubleClicked(QTableWidgetItem *item)
{SoftKeyBoard keyBoard;QString text = item->text();keyBoard.setValue(text);int key = keyBoard.exec();if(key == QMessageBox::Ok){QString text = keyBoard.getValue();item->setText(text);}
}

QT 软键盘 兼容QT4/QT5相关推荐

  1. Qt软键盘使用和修改软键盘参数 支持中文

    Qt软键盘使用和修改软键盘参数 概述 效果预览 一.修改pro文件,添加软键盘模块 二.修改main.cpp文件,加载软键盘 三.代码没有写错但是软键盘显示不出来问题 四. 修改软件盘的尺寸 1.下载 ...

  2. Qt软键盘中/英文输入法

    Qt软键盘中/英文输入法 Qt软键盘,实现中文/英文输入法功能. Qt5.7版本之后,Qt官网也推出了一款支持中文输入的软键盘. 此软键盘来源于笑颜,得到同意才发此文章.一是进行记录,二是后期会在此版 ...

  3. 天津达内聊H5 软键盘兼容方案

    最近一段时间在做 H5 聊天项目,过程中踩过一个大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.作者实验了一些机型,发现了一些问题,并且逐一探索 ...

  4. 移动端软键盘兼容方案

    转自:https://segmentfault.com/a/1190000018959389 前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶) ...

  5. 可能这些是你想要的 H5 软键盘兼容方案

    作者 | wuwhs 来源 | https://segmentfault.com/a/1190000018959389 作者最近一段时间在做 H5 聊天项目,过程中踩过一个大坑:输入框获取焦点,软键盘 ...

  6. QT 软键盘实现

    在树莓派下面运行了一下我的写的代码,发现在输入框中并不能使用键盘输入内容,什么都不能输入,只能自己实现软键盘. QT 的事件处理: Qt 程序需要在main()函数创建一个QCoreApplicati ...

  7. ubuntu下qt模拟键盘按键按下_基于Linux+Qt软键盘设计及其实现.pdf

    计算机与现代化 YUXIANDAIHUA 2011年第12期 JISUANJI 总第196期 文章编号:1006-2475(2011)12-0179-03 基于Linux Qt的软键盘设计与实现 田福 ...

  8. qt调用android键盘,QT 软键盘输入

    1.从QInputContext派生自己的InputContext类 ,例如: class MyInputPanelContext : public QInputContext { Q_OBJECT ...

  9. Qt 软键盘的实现(QWidget),支持中文输入法、数字、英文切换

    **出发点:由于Qt自带的软键盘是QML的,如果使用QWidget模式去编写调用自带的软键盘的话,在ARM下运行会全屏漆黑,并不是我们想要的效果,所以,在网上搜了很多的资料,自己去做了自制键盘,在项目 ...

最新文章

  1. 计算机ui答辩,KGUT1027 班级UI设计第一阶段成长答辩开始啦
  2. java基盘JavaScript_JavaWeb学习:SSH整合(无障碍整合)
  3. CRT中的时间(time_t和tm)
  4. Boost.Signals 的文档/查看示例
  5. Metadata Service 最高频的应用 - 每天5分钟玩转 OpenStack(164)
  6. 安卓从业者应该关注:Android 6.0的运行时权限
  7. MyEclipse中SVN的常见的使用方法
  8. 初学体验是兴趣养成的重要土壤
  9. 全栈工程师的价值是什么?
  10. 刷抖音看美腿中毒后,我决定做一款抖音App
  11. 一周学会linux实战 下载 pdf_UOS可用的pdf编辑工具
  12. html中对应Word中的字体和字号
  13. PNP与NPN的转换电路
  14. fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error
  15. 经典WinCC如何移植到TIA博途WinCC Professional?
  16. 苹果笔的代替笔有哪些?Ipad好用电容笔测评
  17. php if为空那么,PHP中判断数组是否为空的方法
  18. 从中石油辞职好后悔_从石油到移动互联网
  19. BaiduOCR实现身份证,银行卡,机动车牌,图像审核等识别
  20. php音视频边下边播,视频个别片段加旁白,就是我边播放视频边录制旁白或声音...

热门文章

  1. 不需要考虑mid+1、mid-1的二分查找模板,希望大家都能学会
  2. 【vue】解决跨域问题的原理
  3. excel 学习笔记
  4. Mysql 基础语法应用
  5. 圆角装饰条_深圳圆角镜框线条_图文
  6. python画皮卡丘全身立体_超酷!用 Python 教你绘制皮卡丘和哆啦A梦
  7. 网银U盾潜在安全漏洞之忧
  8. MySQL时区错误处理方法
  9. 获得淘宝商品评论(问答) API 返回值说明
  10. ATKCK红队评估靶场 (二)