QT自定义空间之软键盘

1.功能列表

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

2.效果

2.1 中文键盘&汉字输入

在这里插入图片描述

2.2 英文输入法

在这里插入图片描述

2.3 数字键盘

在这里插入图片描述

2.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
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值