zoukankan      html  css  js  c++  java
  • 项目实战: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

  • 相关阅读:
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q36-Q39)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q32-Q35)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q29-Q31)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q25-Q28)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q21-Q24)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q19-Q20)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q16-Q18)
    Sharepoint学习笔记—习题系列--70-576习题解析 -(Q13-Q15)
    c# 操作excel 替代方案
    c# 字体安装
  • 原文地址:https://www.cnblogs.com/qq21497936/p/14208622.html
Copyright © 2011-2022 走看看