不知道上次有没有小伙伴用我的思路自己去实现一遍虚拟键盘,上次的版本存在一些的缺陷,我并不是在点击输入文本框时显示键盘的,而是通过鼠标的点击事件显示键盘的。因为当时那版的功能我没有在网上查到怎么去实现,但这次则实现了点击文本框显示键盘的功能,还添加了切换字母大小写功能、可通过鼠标移动虚拟键盘的功能。这些都是在网上找的,然后我拼起来的。来个图片预览。
之前的思路不再概述,直接在原有基础上进行改进。
一、切换字母大小写功能
原来是在构造函数中直接对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();
}
说完了,不过字数好像有点少啊。再加两个图片
大写锁定切换