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(); }
说完了,不过字数好像有点少啊。再加两个图片

大写锁定切换
