请选择 进入手机版 | 继续访问电脑版

项目实战:Qt中英文输入软键盘(支持Qt4、Qt5、触摸和键鼠混合输入等)

[复制链接]
盛夏丨光年丶 发表于 2020-12-31 18:56:57 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
若该文为原创文章,转载请注明原文出处
本文章博客所在:https://blog.csdn.net/qq21497936/article/details/111831179
恒久连续带来更多项目与技能分享,咨询请加QQ:21497936、微信:yangsir198808
红胖子(红模拟)的博文大全:开发技能集合(包罗Qt实用技能、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)连续更新中…(点击传送门)
开发专栏:项目实战


需求

  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
  1. #ifndef KEYBOARDWIDGET_H#define KEYBOARDWIDGET_H#include #include #include namespace Ui {class KeyBoardWidget;}class KeyBoardWidget : public QWidget{    Q_OBJECTprivate:    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 _listCharacterBtns;    QList _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
  1. #include "KeyBoardWidget.h"#include "ui_KeyBoardWidget.h"#include #include #include #include #include #include #include #include #include #include ...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

来源:https://blog.csdn.net/qq21497936/article/details/111831179
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )