前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt项目之虚拟键盘V1.1

Qt项目之虚拟键盘V1.1

作者头像
用户5908113
发布2019-09-30 14:02:38
1.8K0
发布2019-09-30 14:02:38
举报
文章被收录于专栏:Pou光明Pou光明

不知道上次有没有小伙伴用我的思路自己去实现一遍虚拟键盘,上次的版本存在一些的缺陷,我并不是在点击输入文本框时显示键盘的,而是通过鼠标的点击事件显示键盘的。因为当时那版的功能我没有在网上查到怎么去实现,但这次则实现了点击文本框显示键盘的功能,还添加了切换字母大小写功能、可通过鼠标移动虚拟键盘的功能。这些都是在网上找的,然后我拼起来的。来个图片预览。

之前的思路不再概述,直接在原有基础上进行改进。

一、切换字母大小写功能

原来是在构造函数中直接对Button布局,没有存储起来,从而造成无法修改。我改进的方式是将字母直接都存储起来,如果按下大写锁定按钮,则将所有字母的Text刷新成大写的,反之刷新成小写的。文本框发送字母时也是同样的情况。听起来可能都是这样的,只是在实现时有没有更好地技巧。

构造函数中:

代码语言:javascript
复制
 if(keyboardLayout[i].key >= Qt::Key_A && keyboardLayout[i].key <= Qt::Key_Z)
        {
            letterBt[i -12] = new QPushButton;
            letterBt[i -12]->setFixedWidth(40);
            letterBt[i -12]->setText(QString::fromLatin1(keyboardLayout[i].label));

            mapper->setMapping(letterBt[i -12], keyboardLayout[i].key);
            connect(letterBt[i -12], SIGNAL(clicked()), mapper, SLOT(map()));

            gridLayout->addWidget(letterBt[i -12], row, column);
        }

二、点击文本框焦点弹出键盘

这里使用了事件过滤器,需要将每个需要弹出的文本框预先安装事件过滤器。关于Qt的事件以及事件过滤器以后可能会单独的说一下。

代码语言:javascript
复制
 ui->lineEdit->installEventFilter(this);
    ui->textEdit->installEventFilter(this);


    if (event->type() == QEvent::FocusIn)
    {
        if (watched == ui->lineEdit)
        {
            m_keyboard->setFocusWidget(ui->lineEdit);
            m_keyboard->showKeyboard(this->pos().x(),this->y() +
                                     this->frameGeometry().height());
        }
        else if (watched == ui->textEdit)
        {
            m_keyboard->setFocusWidget(ui->textEdit);
            m_keyboard->showKeyboard(this->pos().x(),this->y() +
                                     this->frameGeometry().height());
        }
    }
    else if (event->type() == QEvent::FocusOut)
    {
        m_keyboard->hideKeyboard();
    }

return QWidget::eventFilter(watched, event);

先判断是否获得焦点,再判断获得焦点的控件是否是我们已经注册事件过滤器的控件,如果是则进行键盘响应;反之如果是失去焦点事件则隐藏键盘。

三、使用鼠标左键可移动键盘

在键盘类中重新实现鼠标事件。

代码语言:javascript
复制
 if (event->buttons() == Qt::LeftButton)
    {
        move(event->globalPos() - dragPosition);
        event->accept();
    }

说完了,不过字数好像有点少啊。再加两个图片

大写锁定切换

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Pou光明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档