Qt之点击QLineEdit显示软键盘
点击QLineEdit显示软键盘
在嵌入式开发时,不能通过鼠标键盘输入是很常见的。这时候就需要通过软件层,实现软键盘和输入法来满足用户需求。
一般来说,软键盘的显示通常和QLineEdit的点击事件挂钩。而QLineEdit与QPushButton不同,它并没有clicked的信号,因此需要通过别的方式来监测点击事件。
因此,点击QLineEdit显示软键盘可以解耦为两个问题:1)软键盘+输入法; 2)软键盘触发。
1)软键盘+输入法
一般来说不推荐造轮子,软键盘目前有大量的开源项目,这里推荐这篇博文。(后面的软键盘触发内容也是基于它来写的)
轻量级Qt键盘-实现篇
此外Github上也有不少开源项目,根据个人需求修改。
2)软键盘触发
由于QLineEdit不支持点击事件,因此要么通过写一个类,继承QLineEdit,如这篇文章:
QT给控件QLineEdit添加clicked()事件方法
要么通过监视焦点来控制软键盘的开闭。
下面展示监视焦点的方法(以1)中的软键盘为例)。
首先在需要加入软键盘的页面.h的slots中声明
bool eventFilter(QObject *,QEvent *);
void keyPressEvent(QKeyEvent * event);
并在private中声明软键盘
QWidget *window = nullptr;
ps. 我的页面中只有三个控件,包括两个QLineEdit和一个QPushButton,进入此页面时Qt会默认焦点在最先实例化的控件上。我这里最先实例化的是一个QLineEdit,因此进入页面时,焦点聚集在此,导致Placeholder里的内容显示不出来,因此通过Btn -> setFocus();
cpp使QLineEdit失焦。
然后在对应的.cpp中实现
bool 你的类::eventFilter(QObject *watched, QEvent *event)
{
if (watched == 第一个QLineEdit) //首先判断控件
{
if (event->type()==QEvent::FocusIn) //然后再判断控件的具体事件 (这里指获得焦点事件)
{
// qDebug("LEd1 is watched!");
window = new QWidget(this);
window -> move(0,920);
window -> setFixedSize(720,360);
QLineEdit textInput(&keyboard);
QVBoxLayout *v = new QVBoxLayout;
v->addWidget(&textInput, 1);
v->addWidget(&keyboard, 5);
window->setLayout(v);
window->show();
}
}
else if(watched == pwdLEd)
{
if (event->type()==QEvent::FocusIn)
{
// qDebug("LEd2 is watched!");
window = new QWidget(this);
window -> move(0,920);
window -> setFixedSize(720,360);
QLineEdit textInput(&keyboard);
QVBoxLayout *v = new QVBoxLayout;
v->addWidget(&textInput, 1);
v->addWidget(&keyboard, 5);
window->setLayout(v);
window->show();
}
}
else
{
// qDebug("Btn is watched!");
}
return QWidget::eventFilter(watched,event); // 最后将事件交给上层对话框
}
这里只实现了window的开启,效果是点击两个中任意一个QLineEdit,软键盘都会开启。如果需要关闭软键盘,就需要在合适的时机使用window -> close();
例如在按钮的槽函数中。
此外还有一个细节,软键盘上有enter键的话,则需要重写回车事件。Qt的有默认的回车事件,通常在实例化的第一个能执行回车的控件上,如果它不是你要的,就像如下所示重写。
void 你的类::keyPressEvent(QKeyEvent * event)
{
if(event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) //同时监控大键盘和小键盘上的enter键
func(); //实例化的槽函数
}
这样点击软键盘上的回车就会执行func()了。
打完收工~
更多推荐
所有评论(0)