项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)
2020-12-29 20:33
826 查看
需求
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 _strKey 56c boradCharacters; 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( 56c 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); ad0 _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(u 247f i->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
相关文章推荐
- <Qt5 实战>No.02 简易软键盘 - 支持中文输入
- Qt4项目迁移到Qt5问题:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- Qt4项目迁移Qt5项目一问题解决方法:#include <QtGui/QApplication> ---> No such file or directory
- 【项目实战】--仅对 LINQ to Entities 中已排序的输入支持方法“Skip”。必须在调用“Skip”方法之前调用方法“OrderBy”
- Qt4项目迁移到Qt5问题:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets .
- Qt4项目迁移到Qt5问题:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets .
- Qt4项目迁移到Qt5问题:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets .
- Qt4项目迁移Qt5项目一问题解决方法:#include <QtGui/QApplication> ---> No such file or directory
- Qt4项目迁移到Qt5问题:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- QT项目升级(QT4到QT5)时,遇到的问题和解决方法
- Qt creator 如何支持中文编码(Qt4和Qt5解决方法不同)
- Qt 5.4正式发布!引入WP,支持HTML5混合开发
- 从Qt4到Qt5的,主要的进化有三(对于QtWidget的精简和优化会很有限)
- 最简单易用的Qt 界面库插件 FTStyle (三)Qt4与Qt5如何选择
- 【无私分享:ASP.NET CORE 项目实战(第十二章)】添加对SqlServer、MySql、Oracle的支持
- 让qt应用程序支持触摸
- Qt5虚拟键盘-支持中文输入
- 个人练习项目:Qt开发视频播放器,支持跨局域网,创建房间,房间内多人聊天,发弹幕,同步视频播放进度
- qt5打开qt4项目时出错及解决办法
- C++(qt)游戏实战项目:坦克大战(六源代码)