QT自定义空间之软键盘

QT自定义空间之软键盘

  • 1.功能列表
  • 2.效果
    • 2.1 中文键盘&汉字输入
    • 2.2 英文输入法
    • 2.3 数字键盘
    • 2.4 数据键盘效果
  • 3.部分代码
    • 3.1 汉字输入
    • 3.2 切换数字键盘
    • 3.3 键盘显示&隐藏
    • 3.4 控件提升
    • 3.5样式设置
    • 3.6 使用QLineEditAllKeyBoard 控件

1.功能列表

  • 支持中文输入法
  • 支持引文输入
  • 支持数字键盘
  • 支持中文/英文/数字软键盘切换

2.效果

2.1 中文键盘&汉字输入

QT自定义空间之软键盘_第1张图片

2.2 英文输入法

QT自定义空间之软键盘_第2张图片

2.3 数字键盘

QT自定义空间之软键盘_第3张图片

2.4 数据键盘效果

QT自定义空间之软键盘_第4张图片

3.部分代码

3.1 汉字输入

基于googlepingyin输入

void KeyboardForm::displayHanzi()
{
    if (m_hanziPageCnt <= 0)
    {
        m_listHanzi[0]->setEnabled(false);
        m_listHanzi[hanziCandidate-1]->setEnabled(false);
        for (int i = 0; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText("");
            m_listHanzi[i+1]->setEnabled(false);
        }
    }
    else if (m_hanziPageCnt == 1)
    {
        m_listHanzi[0]->setEnabled(false);
        m_listHanzi[hanziCandidate-1]->setEnabled(false);
        int len = m_pinyin.HanziModel.size();
        for (int i = 0; i < len; i++)
        {
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[i]);
            m_listHanzi[i+1]->setEnabled(true);
        }
        for (int i = len; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText("");
            m_listHanzi[i+1]->setEnabled(false);
        }
    }
    else if (m_curHanziPage == 1)
    {
        m_listHanzi[0]->setEnabled(false);
        m_listHanzi[hanziCandidate-1]->setEnabled(true);
        for (int i = 0; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->hide();
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[i]);
            m_listHanzi[i+1]->setEnabled(true);
            m_listHanzi[i+1]->show();
        }
    }
    else if (m_curHanziPage == m_hanziPageCnt)
    {
        m_listHanzi[0]->setEnabled(true);
        m_listHanzi[hanziCandidate-1]->setEnabled(false);
        qDebug() << m_pinyin.HanziModel << m_pinyin.HanziModel.size();
        int len = m_pinyin.HanziModel.size() % (hanziCandidate-2);
        int idx = (m_hanziPageCnt - 1) * (hanziCandidate-2);
        if (len == 0)
        {
            len = hanziCandidate-2;
        }

        for (int i = 0; i < len; i++)
        {
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[idx + i]);
            m_listHanzi[i+1]->setEnabled(true);
        }
        for (int i = len; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText("");
            m_listHanzi[i+1]->setEnabled(false);
        }
    }
    else
    {
        m_listHanzi[0]->setEnabled(true);
        m_listHanzi[hanziCandidate-1]->setEnabled(true);
        int idx = (m_curHanziPage - 1) * (hanziCandidate-2);
        for (int i = 0; i < hanziCandidate-2; i++)
        {
            m_listHanzi[i+1]->setText(m_pinyin.HanziModel[idx + i]);
            m_listHanzi[i+1]->setEnabled(true);
        }
    }
}

3.2 切换数字键盘

void KeyboardForm::changeSymbol()
{
    if (m_btnSymbol->text() == ".?123")
    {
        m_btnSymbol->setText("返回");

        // 输出已有的字母
        sendKeyToFocusItem(m_cachePinYin);

        m_hanziPageCnt = 0;
        m_labPyText->clear();
        m_cachePinYin.clear();
        displayHanzi();

        m_shiftKey = false;
        m_inputMode = ImNum;
        m_btnChange->setIconSize(QSize(0,0));
        m_btnChange->setText("数字");
        for (int i = 0; i < m_listCharsBtns.size(); i++)
        {
            m_listCharsBtns[i]->setText(kbSymbol[i] == '&' ? "&&" : QString(QLatin1Char(kbSymbol[i])));
        }
    }
    else
    {
        m_btnSymbol->setText(".?123");
        m_inputMode = (InputMode)m_btnChange->property("Mode").toInt();

        QIcon btn_icon;
        btn_icon.addFile(m_inputMode == ImCn ? ":/image/chinese.png":":/image/english.png");
        m_btnChange->setIcon(btn_icon);
        m_btnChange->setIconSize(QSize(70, 70));
        m_btnChange->setText("");
//        m_btnChange->setText(m_inputMode == ImCn ? "中/英" : "中/英");
        for (int i = 0; i < m_listCharsBtns.size(); i++)
        {
            m_listCharsBtns[i]->setText(QString(QLatin1Char(kbLetter[i])));
        }
    }
}

3.3 键盘显示&隐藏

显示键盘输入法

void InputContext::showInputPanel()
{
    if (!d->KeyBoard)
    {
        d->KeyBoard = new KeyboardForm();
        connect(d->KeyBoard, SIGNAL(sendKeyToFocusItem(QString)), &d->keyEventDispatcher, SLOT(sendKeyToFocusItem(QString)));
    }
    d->KeyBoard->show();
    d->KeyBoard->move(d->KeyBoard->x(), WINDOW_HEIGHT - d->KeyBoard->height());

    QPlatformInputContext::showInputPanel();
}

隐藏键盘输入法

void InputContext::hideInputPanel()
{
    if (d->KeyBoard)
    {
        d->KeyBoard->hide();
    }

    QPlatformInputContext::hideInputPanel();
}

3.4 控件提升

重写QLineEdit控件

class QLineEditAllKeyBoard : public QLineEdit
{
    Q_OBJECT
public:
    explicit QLineEditAllKeyBoard(QWidget *parent = nullptr);

private:
    InputContext *pInputContext;
signals:

public slots:
protected:
    virtual void mousePressEvent(QMouseEvent *event);
};

3.5样式设置

设置整体样式,包含按钮,面板

    setStyleSheet("QWidget{background:#191919;color:#FFFFFF;}"
                  "QPushButton{background-color: #313131; border-width: 5; font: normal;border:1px #313131;color:#FFFFFF;border-radius:1px;padding:1px 2px;} "
                  "QPushButton:hover{background-color: #00B2DB; border-width: 5;}"
                  "QPushButton:pressed{background-color: #00B2DB; border-width: 5;}");

3.6 使用QLineEditAllKeyBoard 控件

提升UI中的QLineEdit控件为QLineEditAllKeyBoard
QT自定义空间之软键盘_第5张图片

你可能感兴趣的:(QT自定义控件,qt,数据库,开发语言)