需求

  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、触摸和键鼠混合输入等)的更多相关文章

  1. h5项目中关于ios手机软键盘导致页面变形的完美解决方案

    1.项目背景:vue项目,手机加短信验证码登录: 2.问题: 在ios中input吊起软键盘,输入完成后,收起软件盘,页面不会回弹,导致页面下方出现空白,也就是页面变形: 3.最开始的解决方案是,用i ...

  2. Android 隐藏输入软键盘

    //隐藏输入键盘 ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(BshTo ...

  3. WinCE6.0多国语言软键盘

    N久以前写过一篇<WinCE下自定义的大软键盘>,这个自定义软键盘就是为RM905a+项目来做的.RM905a+的系统分辨率是640*480,WinCE原生键盘小的太小,大的又太大.所以就 ...

  4. android 弹出的软键盘遮挡住EditText文本框的解决方案

    1.android 弹出的软键盘遮挡住EditText文本框的解决方案: 把Activit对应的布局文件filename.xml文件里的控件用比重设置布局.(例如:android:layout_wei ...

  5. Android软键盘遮挡的四种解决方案

    问题概述 在编辑框输入内容时会弹出软键盘,而手机屏幕区域有限往往会遮住输入界面,我们先看一下问题效果图: 输入用户名和密码时,系统会弹出键盘,造成系统键盘会挡住文本框的问题,如图所示: 输入密码时输入 ...

  6. android软键盘enter键

    enter键,回车键,电脑键盘上enter键就有多种响应.android软键盘也不例外 你在EditText上输入以后,想在下一行输入框输入,可能需要去点击下一行输入框,让它获取焦点,也可能要隐藏软键 ...

  7. EditText默认不弹出软键盘

    #EditText默认不弹出软键盘# 网上关于EditText默认情况下不弹出软键盘,当手触摸到EditText,获取焦点时候,才会弹出软键盘,貌似都不能用,其实,在oncreate()方法中,加上 ...

  8. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  9. qt软键盘输入

      characterapplicationsignalqt输入法object 1.从QInputContext派生自己的InputContext类 ,例如: class MyInputPanelCo ...

  10. QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL

    QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1   C语言程序设计高级实用速成课程 基础+进阶+自学 课程2   C语言程序设计Windows GDI图形绘 ...

随机推荐

  1. [转帖][译]tcpdump 示例教程

    https://colobu.com/2019/07/16/a-tcpdump-tutorial-with-examples/ 目录 [−] 基于IP查找流量 根据来源和目标进行筛选 根据网段进行查找 ...

  2. [转帖]oracle如何删除datafile,误删除Oracle datafile 无法打开数据库

    1.在Oracle open方式下,直接从OS上删除了datafile文件. rm /u02/rmants.dbf 2.数据库关闭后,无法打开数据库,只能到mount状态. SQL> alter ...

  3. 根目录被赋予777 -R权限后的处理过程

    解决某研发手残导致的系统宕机问题的处理过程 背景 2022.8.8 公司一台服务器出现了宕机的现象: 所有的人都无法远程, 都提示密码错误. 但是网络还是通的. 2022.8.12 出差前一天去了一趟 ...

  4. 2022 倒带 - NutUI

    作者:京东零售 于明明 前言 时光飞逝,流年似水,让我们倒带 2022,回首这跌宕起伏一年走过的 "升级之路". NutUI 表现如何? 成绩单等着您打分! 2022 是 NutU ...

  5. 我对computed的理解-以及computed的传参

    computed 传参 <template> <div> <p>computed传参的写法:{{ who1Params('--我是传参的内容') }}</p& ...

  6. Vue3中readonly 和 shallowReadonly和toRaw

    1.readonly 深度只读 被readonly包裹的数据只能够读取. 是一个深度只读,不能够修改. 我们看一下面的代码. 我们想修改值,但是修改后视图无响应. 并且控制台警告目标为只读 reado ...

  7. void的讲解 、any的讲解 、联合类型的讲解

    1. void的使用 空值一般采用 void 来表示,同时void也可以表示变量 也可以表示函数没有返回值哈 使用了 void 就不能够使用 return 哈 let sum = function() ...

  8. TienChin 开篇-运行 RuoYiVue

    开篇 目的: 让大家随心所欲的 DIY 若依的脚手架 不会涉及到太多基础知识 踊跃提问(不懂得地方大家提问我会根据提问,后续一一解答疑惑) 下载 RuoYiVue Gitee: https://git ...

  9. go中string是如何实现的呢

    go中string是如何实现的呢 前言 实现 go语言中的string是不可变的 []byte转string string转[]byte 字符串的拼接 +方式进行拼接 fmt 拼接 Join 拼接 b ...

  10. 探索C语言中的Shellcode从提取到执行

    ShellCode是一种独立于应用程序的机器代码,通常用于实现特定任务,如执行远程命令.注入恶意软件或利用系统漏洞.在网络安全领域,研究Shellcode是理解恶意软件和提高系统安全性的关键一环.本文 ...