项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)
需求
1. 全屏软键盘;
2. 输入英文;
3. 输入中文;
4. 支持触摸、键盘和输入混合输入;
5. 目前有黑色系皮肤;
6. Qt4和Qt5区分2个版本;
Demo:Qt5



CSDN(粉丝免积分下载):https://download.csdn.net/download/qq21497936/13945327
QQ群:1047134658(点击“文件”搜索“softKeyboard”,群内与博文同步更新)
Demo:Qt4
移植到MCGS嵌入式工控机上


V1.0.0





Demo代码
可视化的布局,以便于定制修改,所见即所得:

KeyBoardWidget.h
#ifndef KEYBOARDWIDGET_H
#define KEYBOARDWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QLabel>
namespace Ui {
class KeyBoardWidget;
}
class KeyBoardWidget : public QWidget
{
Q_OBJECT
private:
enum INPUT_MODE {
INPUT_MODE_ZH = 0x01,
INPUT_MODE_EN,
INPUT_MODE_SYMB,
};
public:
explicit KeyBoardWidget(QWidget *parent = 0);
~KeyBoardWidget();
public:
void clearChineseCache();
void setKeyPressEvent(QKeyEvent *event);
signals:
void signal_sendKeyToFocusItem(QString keyText);
protected:
void updateChineseCharactersButtonState();
void switchLanguage(int inputMode);
void searchChineseCharacters(int currentpage);
protected slots:
void slot_characterButtonsClicked();
void slot_switchLanguage();
void slot_backspace();
void slot_blankspace();
void slot_chineseCharacterSelected();
void slot_chineseCharacterPrevious();
void slot_chineseCharacterNext();
void slot_enter();
void slot_upper();
void slot_symbols();
void slot_emoji();
void slot_hideKeyboard();
protected:
void updateKeyboard();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void showEvent(QShowEvent *event);
void hideEvent(QHideEvent *event);
private:
Ui::KeyBoardWidget *ui;
private:
QList<QPushButton*> _listCharacterBtns;
QList<QPushButton*> _listChineseCharactersBtns;
INPUT_MODE _currentMode;
INPUT_MODE _lastMode;
bool _upperMode;
int _symbolPage;
QFont _font;
private:
static QString _strKeyboradCharacters;
static QString _strKeyBoradSymbols[];
};
#endif // KEYBOARDWIDGET_H
KeyBoardWidget.cpp
#include "KeyBoardWidget.h"
#include "ui_KeyBoardWidget.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFontDatabase>
#include <QFile>
#include <QApplication>
#include <QMouseEvent>
#include <QDebug>
#include <QDesktopWidget>
...
KeyBoardWidget::KeyBoardWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::KeyBoardWidget),
_currentMode(INPUT_MODE_EN),
_upperMode(false),
_symbolPage(0)
{
ui->setupUi(this);
this->setFixedSize(qApp->desktop()->width(), 380);
//设置主窗体样式
setWindowFlags(windowFlags()
| Qt::Tool
| Qt::FramelessWindowHint
| Qt::WindowStaysOnTopHint
| Qt::WindowDoesNotAcceptFocus);
//图标字体
int fontId = QFontDatabase::addApplicationFont(":/font/res/FontAwesome.otf");
QString fontName = QFontDatabase::applicationFontFamilies(fontId).at(0);
_font.setFamily(fontName);
_font.setPixelSize(24);
// 中文汉字按键存入列表
_listChineseCharactersBtns.append(ui->pushButton_r1);
_listChineseCharactersBtns.append(ui->pushButton_r2);
_listChineseCharactersBtns.append(ui->pushButton_r3);
_listChineseCharactersBtns.append(ui->pushButton_r4);
_listChineseCharactersBtns.append(ui->pushButton_r5);
for(int index = 0; index < _listChineseCharactersBtns.size(); index++)
{
connect(_listChineseCharactersBtns.at(index), SIGNAL(clicked(bool)), this, SLOT(slot_chineseCharacterSelected()));
}
// 翻页按键
ui->pushButton_prev->setFont(_font);
ui->pushButton_prev->setText(QString(QChar(0xf0d9)));
connect(ui->pushButton_prev, SIGNAL(clicked(bool)), this, SLOT(slot_chineseCharacterPrevious()));
ui->pushButton_next->setFont(_font);
ui->pushButton_next->setText(QString(QChar(0xf0da)));
connect(ui->pushButton_next, SIGNAL(clicked(bool)), this, SLOT(slot_chineseCharacterNext()));
// 字符按键存入列表
_listCharacterBtns.append(ui->pushButton_c1);
_listCharacterBtns.append(ui->pushButton_c2);
_listCharacterBtns.append(ui->pushButton_c3);
_listCharacterBtns.append(ui->pushButton_c4);
_listCharacterBtns.append(ui->pushButton_c5);
_listCharacterBtns.append(ui->pushButton_c6);
_listCharacterBtns.append(ui->pushButton_c7);
_listCharacterBtns.append(ui->pushButton_c8);
_listCharacterBtns.append(ui->pushButton_c9);
_listCharacterBtns.append(ui->pushButton_c10);
_listCharacterBtns.append(ui->pushButton_c11);
_listCharacterBtns.append(ui->pushButton_c12);
_listCharacterBtns.append(ui->pushButton_c13);
_listCharacterBtns.append(ui->pushButton_c14);
_listCharacterBtns.append(ui->pushButton_c15);
_listCharacterBtns.append(ui->pushButton_c16);
_listCharacterBtns.append(ui->pushButton_c17);
_listCharacterBtns.append(ui->pushButton_c18);
_listCharacterBtns.append(ui->pushButton_c19);
_listCharacterBtns.append(ui->pushButton_c20);
_listCharacterBtns.append(ui->pushButton_c21);
_listCharacterBtns.append(ui->pushButton_c22);
_listCharacterBtns.append(ui->pushButton_c23);
_listCharacterBtns.append(ui->pushButton_c24);
_listCharacterBtns.append(ui->pushButton_c25);
_listCharacterBtns.append(ui->pushButton_c26);
_listCharacterBtns.append(ui->pushButton_c27);
_listCharacterBtns.append(ui->pushButton_c28);
_listCharacterBtns.append(ui->pushButton_c29);
for(int index = 0; index < _strKeyboradCharacters.size(); index++)
{
_listCharacterBtns.at(index)->setText(_strKeyboradCharacters.at(index));
connect(_listCharacterBtns.at(index), SIGNAL(clicked(bool)),
this, SLOT(slot_characterButtonsClicked()));
}
// 功能键:回退
ui->pushButton_backspace->setText(QChar(0xf060));
ui->pushButton_backspace->setFont(_font);
connect(ui->pushButton_backspace, SIGNAL(clicked(bool)), this, SLOT(slot_backspace()));
// 功能键:大小写
ui->pushButton_upper->setFont(_font);
ui->pushButton_upper->setText(QChar(0xf062));
connect(ui->pushButton_upper, SIGNAL(clicked(bool)), this, SLOT(slot_upper()));
// 功能键:回车
ui->pushButton_enter->setFont(_font);
ui->pushButton_enter->setText("Enter");
connect(ui->pushButton_enter, SIGNAL(clicked(bool)), this, SLOT(slot_enter()));
// 功能键:切换符号
ui->pushButton_symbol->setText(".?123");
connect(ui->pushButton_symbol, SIGNAL(clicked(bool)), this, SLOT(slot_symbols()));
// 功能键:语言切换
ui->pushButton_language->setText("English");
connect(ui->pushButton_language, SIGNAL(clicked(bool)), this, SLOT(slot_switchLanguage()));
// 功能键:空格
ui->pushButton_blankspace->setText("");
connect(ui->pushButton_blankspace, SIGNAL(clicked(bool)), this, SLOT(slot_blankspace()));
// 功能键:表情
ui->pushButton_emoji->setFont(_font);
ui->pushButton_emoji->setText(QChar(0xf118));
connect(ui->pushButton_emoji, SIGNAL(clicked(bool)), this, SLOT(slot_emoji()));
// 功能键:隐藏
ui->pushButton_hideKeyboard->setFont(_font);
ui->pushButton_hideKeyboard->setText(QString(QChar(0xf11c)).append(QChar(0xf103)));
connect(ui->pushButton_hideKeyboard, SIGNAL(clicked(bool)), this, SLOT(slot_hideKeyboard()));
updateChineseCharactersButtonState();
}
KeyBoardWidget::~KeyBoardWidget()
{
delete ui;
}
...
void KeyBoardWidget::setKeyPressEvent(QKeyEvent *event)
{
if(_currentMode == INPUT_MODE_SYMB
&& _symbolPage == 0)
{
switch (event->key())
{
case Qt::Key_1:
_listCharacterBtns.at(0)->click();
break;
case Qt::Key_2:
_listCharacterBtns.at(1)->click();
break;
case Qt::Key_3:
_listCharacterBtns.at(2)->click();
break;
case Qt::Key_4:
_listCharacterBtns.at(3)->click();
break;
case Qt::Key_5:
_listCharacterBtns.at(4)->click();
break;
case Qt::Key_6:
_listCharacterBtns.at(5)->click();
break;
case Qt::Key_7:
_listCharacterBtns.at(6)->click();
break;
case Qt::Key_8:
_listCharacterBtns.at(7)->click();
break;
case Qt::Key_9:
_listCharacterBtns.at(8)->click();
break;
case Qt::Key_0:
_listCharacterBtns.at(9)->click();
break;
case Qt::Key_Backspace:
ui->pushButton_backspace->click();
break;
case Qt::Key_Return:
ui->pushButton_enter->click();
break;
default:
break;
}
}
else
{
switch (event->key())
{
case Qt::Key_Q:
_listCharacterBtns.at(0)->click();
break;
case Qt::Key_W:
_listCharacterBtns.at(1)->click();
break;
case Qt::Key_E:
_listCharacterBtns.at(2)->click();
break;
case Qt::Key_R:
_listCharacterBtns.at(3)->click();
break;
case Qt::Key_T:
_listCharacterBtns.at(4)->click();
break;
case Qt::Key_Y:
_listCharacterBtns.at(5)->click();
break;
case Qt::Key_U:
_listCharacterBtns.at(6)->click();
break;
case Qt::Key_I:
_listCharacterBtns.at(7)->click();
break;
case Qt::Key_O:
_listCharacterBtns.at(8)->click();
break;
case Qt::Key_P:
_listCharacterBtns.at(9)->click();
break;
case Qt::Key_A:
_listCharacterBtns.at(10)->click();
break;
case Qt::Key_S:
_listCharacterBtns.at(11)->click();
break;
case Qt::Key_D:
_listCharacterBtns.at(12)->click();
break;
case Qt::Key_F:
_listCharacterBtns.at(13)->click();
break;
case Qt::Key_G:
_listCharacterBtns.at(14)->click();
break;
case Qt::Key_H:
_listCharacterBtns.at(15)->click();
break;
case Qt::Key_J:
_listCharacterBtns.at(16)->click();
break;
case Qt::Key_K:
_listCharacterBtns.at(17)->click();
break;
case Qt::Key_L:
_listCharacterBtns.at(18)->click();
break;
case Qt::Key_Z:
_listCharacterBtns.at(19)->click();
break;
case Qt::Key_X:
_listCharacterBtns.at(20)->click();
break;
case Qt::Key_C:
_listCharacterBtns.at(21)->click();
break;
case Qt::Key_V:
_listCharacterBtns.at(22)->click();
break;
case Qt::Key_B:
_listCharacterBtns.at(23)->click();
break;
case Qt::Key_N:
_listCharacterBtns.at(24)->click();
break;
case Qt::Key_M:
_listCharacterBtns.at(25)->click();
break;
case Qt::Key_Comma:
_listCharacterBtns.at(26)->click();
break;
case Qt::Key_Period:
_listCharacterBtns.at(27)->click();
break;
case Qt::Key_Question:
_listCharacterBtns.at(28)->click();
break;
case Qt::Key_Backspace:
ui->pushButton_backspace->click();
break;
case Qt::Key_Space:
ui->pushButton_blankspace->click();
break;
case Qt::Key_Return:
ui->pushButton_enter->click();
break;
case Qt::Key_CapsLock:
ui->pushButton_upper->click();
break;
default:
break;
}
}
}
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111831179
项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)的更多相关文章
- h5项目中关于ios手机软键盘导致页面变形的完美解决方案
1.项目背景:vue项目,手机加短信验证码登录: 2.问题: 在ios中input吊起软键盘,输入完成后,收起软件盘,页面不会回弹,导致页面下方出现空白,也就是页面变形: 3.最开始的解决方案是,用i ...
- Android 隐藏输入软键盘
//隐藏输入键盘 ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(BshTo ...
- WinCE6.0多国语言软键盘
N久以前写过一篇<WinCE下自定义的大软键盘>,这个自定义软键盘就是为RM905a+项目来做的.RM905a+的系统分辨率是640*480,WinCE原生键盘小的太小,大的又太大.所以就 ...
- android 弹出的软键盘遮挡住EditText文本框的解决方案
1.android 弹出的软键盘遮挡住EditText文本框的解决方案: 把Activit对应的布局文件filename.xml文件里的控件用比重设置布局.(例如:android:layout_wei ...
- Android软键盘遮挡的四种解决方案
问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ...
- android软键盘enter键
enter键,回车键,电脑键盘上enter键就有多种响应.android软键盘也不例外 你在EditText上输入以后,想在下一行输入框输入,可能需要去点击下一行输入框,让它获取焦点,也可能要隐藏软键 ...
- EditText默认不弹出软键盘
#EditText默认不弹出软键盘# 网上关于EditText默认情况下不弹出软键盘,当手触摸到EditText,获取焦点时候,才会弹出软键盘,貌似都不能用,其实,在oncreate()方法中,加上 ...
- 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- qt软键盘输入
characterapplicationsignalqt输入法object 1.从QInputContext派生自己的InputContext类 ,例如: class MyInputPanelCo ...
- QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL
QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1 C语言程序设计高级实用速成课程 基础+进阶+自学 课程2 C语言程序设计Windows GDI图形绘 ...
随机推荐
- [转帖]Jmeter常用配置元件(二):“HTTP Cookie管理器”登录状态保持
在API接口测试过程中,我们需要传递cookie值作为连接状态的保持,例如登录后状态信息.通过使用Jmeter提供的"HTTP Cookie管理器"来实现. 一般情况下不需要输入什 ...
- Kafka学习之四_Grafana监控相关的学习
Kafka学习之四_Grafana监控相关的学习 背景 想一并学习一下kafaka的监控. 又重新开始学习grafana了: 下载地址: https://grafana.com/grafana/dow ...
- 【转帖】【奇技淫巧】Linux | 统计网络-netstat
theme: condensed-night-purple 小知识,大挑战!本文正在参与"程序员必备小知识"创作活动. 在构建生产服务器时,我们有的时候需要统计网络接口状况,比如T ...
- 一文带你搞懂如何优化慢SQL
作者:京东科技 宋慧超 一.前言 最近通过SGM监控发现有两个SQL的执行时间占该任务总执行时间的90%,通过对该SQL进行分析和优化的过程中,又重新对SQL语句的执行顺序和SQL语句的执行计划进行了 ...
- scss常用语法
在线编译 https://wow.techbrood.com/fiddle/11143 群组选择器的嵌套[编译前] .container { h1, h2, h3 {margin-bottom: .8 ...
- 小程序之使用阿里字体图标 定义主题的颜色 控制首页标题的样式 如何使用组件 水平居中和垂直居中的方式 H5 关于上线后,
项目搭建 1==> 需要创建的文件夹 styles 存放公共的样式 components 存放组件 lib第三方库的 utils 自己的帮助库 reques 自己的接口 2==>如何快速创 ...
- 【k哥爬虫普法】程序员183并发爬取官方网站,直接获刑3年?
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- go中异常处理流程
在 Go 语言中,panic.recover 和 defer 是用于处理异常情况的关键字.它们通常一起使用来实现对程序错误的处理和恢复. 1. defer 语句 defer 用于在函数返回之前执行一段 ...
- Protocol Buffer命名空间冲突
原文在这里. 什么是Protocol Buffer命名空间冲突? 所有链接到Go二进制文件的Protocol Buffer声明都被插入到一个全局注册表中. 每个Protocol Buffer声明(例如 ...
- vim 从嫌弃到依赖(10)——缓冲区列表
之前的一系列文章主要介绍了vim文本相关的操作,并且也介绍了vim的几种模式.通过前面的内容,相信各位小伙伴们已经对vim有了一个基本的了解,同时也能够使用vim快速编辑文本,从这篇开始,我们将要介绍 ...