Qt项目之虚拟键盘V1.1

  • 2019 年 10 月 11 日
  • 笔记

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

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

一、切换字母大小写功能

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

构造函数中:

 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的事件以及事件过滤器以后可能会单独的说一下。

 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);

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

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

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

 if (event->buttons() == Qt::LeftButton)      {          move(event->globalPos() - dragPosition);          event->accept();      }

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

大写锁定切换