项目实战: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图形绘 ...
随机推荐
- 【转帖】linux环境下使用route指令设置多个网络连接的优先级(通过修改路由表的默认网关条目)
1. 背景 在生活中的会经常遇见一台PC同时连接多个网络的场景.最典型的,一台笔记本可以同时连接一个无线网(手机热点)和一个有线网(以太网).linux和window操作系统在默认情况都会使用最早连接 ...
- 微软Windows Sever系统也将强制要求TPM及CPU兼容
https://www.cnbeta.com/articles/tech/1238647.htm 去年微软推出Win11系统时,TPM安全模块以及Intel 8代酷睿/AMD锐龙2代及以上的硬件要求引 ...
- 京东云开发者|提高IT运维效率,深度解读京东云AIOps落地实践
基于深度学习对运维时序指标进行异常检测,快速发现线上业务问题 时间序列的异常检测是实际应用中的一个关键问题,尤其是在 IT 行业.我们没有采用传统的基于阈值的方法来实现异常检测,而是通过深度学习提出了 ...
- flutter项目目录介绍
1 flutter项目目录介绍 android 安卓平台的的相关代理 build 编译后的 ios ios 平台的的相关代理 lib 自己写代码的目录 包好自己的代码 资源 test 放测试文件的 p ...
- 【一个构想】pull方式获取expoter上的数据,如何更加精简?
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 背景 已知:在prometheus中,每个业务节点通过prometheu ...
- 【Jmeter】基础介绍-详细
最近做压测时使用到Jmeter,为什么用它,之前也做过部分压测,不是很系统,使用的是Apache Bench,虽然效率高,但是功能比较简单,不太适合本次压测场景,另外Jmeter能更好的利用压测机的多 ...
- Python 实现指定窗口置顶激活
通过Python实现对特定窗口的置顶操作以及对特定窗体发送按键,这里需要安装一个第三方pip包,执行命令pywin32安装好以后,我们运行试试. 第一个案例,遍历所有句柄,然后对特定窗口进行最大化或最 ...
- UDP通信 [补档-2023-07-22]
UDP通信 6-1 简介 UDP通信是面向无链接的,不稳定,不可靠,不安全的一种通信方式.TCP在通信前发送方会向接收方进行三次握手链接,然后确认双方链接后才会进行数据传输,最后四次挥手保证链接关 ...
- VB6的OfficeMenu控件 - 开源研究系列文章
这次将原来VB6中喜欢和使用到的OfficeMenu的控件做一个使用介绍. 上次介绍了VB6中的控件引擎,但是那个只针对基本的控件,这个OfficeMenu控件在当时是收费的,笔者找度娘好不容易才下载 ...
- Web服务器实现|基于阻塞队列线程池的Http服务器|线程控制|Http协议
基于阻塞队列生产者消费者模型线程池的多线程Web服务器 代码地址:WebServer_GitHub_Addr README 摘要 本实验通过C++语言,实现了一个基于阻塞队列线程池的多线程Web服务器 ...