项目实战: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图形绘 ...
随机推荐
- [转帖]py_innodb_page_info.py工具使用
目录 一.Linux安装Python3 1. 解压包 2. 安装环境 3. 生成编译脚本 4. 检查python3.10的编译器 5. 建立Python3和pip3的软链 6. 添加到PATH 7. ...
- 【转帖】Linux性能优化(十四)——CPU Cache
一.CPU Cache 1.CPU Cache简介 CPU Cache是位于CPU与内存之间的临时存储器,容量比内存小但交换速度却比内存要快得多.Cache的出现主要是为了解决CPU运算速度与内存读写 ...
- [转帖]JVM 参数
https://www.cnblogs.com/xiaojiesir/p/15636100.html 我们可以在启动 Java 命令时指定不同的 JVM 参数,让 JVM 调整自己的运行状态和行为,内 ...
- NextJs 与 Tailwind 入门开发笔记
前言 距离上次更新已经过去好久了,之前我在 StarBlog 博客2023年底更新一览的文章里说要使用 Next.js 来重构博客前端,最近也确实用 next.js 做了两个小项目,一个是单点认证项目 ...
- ClickHouse(08)ClickHouse表引擎概况
目录 合并树家族 日志引擎系列 集成的表引擎 其他特殊的引擎 资料分享 参考文章 目前ClickHouse的表引擎主要有下面四个系列,合并树家族.日志引擎系列.集成的表引擎和其他特殊的引擎. 合并树家 ...
- [3] 以逆向的角度来看循环语句——do、while、for的比较
[3] 以逆向的角度来看循环语句--do.while.for的比较 1. do循环 先执行循环体,后比较判断 #include <stdio.h> int main(int argc, ...
- 从零开始匹配vim(2)——快捷键绑定
如果说 vim有什么最吸引人,我想vim允许你自由的定义各种快捷键算是一个原因吧.你可以通过绑定各种快捷键来使经常使用的功能更加便利.通俗的讲,快捷键映射就是我按下某个键,我想让vim将它当成另一个键 ...
- Java开发中PO、VO、DAO、BO、DTO、POJO 含义
PO(persistant object) 持久对象 可以看成是与数据库中的表相映射的java对象.使用 Mybatis 来生成 PO 是不错的选择. VO(value object) 值对象 通常用 ...
- 【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
1.分布式训练简介 分布式训练的核心目的: 加快模型的训练速度.通过对训练任务按照一定方法拆分分配到多个计算节点进行计算,再按照一定的方法对需要汇总的信息进行聚合,从而实现加快训练速度的目的. 1.1 ...
- 强化学习调参技巧一: DDPG算法训练动作选择边界值_分析解决
1.原因: 选择动作值只在-1 1之间取值 actor网络输出用tanh,将动作规范在[-1,1],然后线性变换到具体的动作范围.其次,tanh激活区是有范围的,你的预激活变量(输入tanh的)范围太 ...