Qt之点击QLineEdit显示软键盘 您所在的位置:网站首页 微软输入法如何调出软键盘 Qt之点击QLineEdit显示软键盘

Qt之点击QLineEdit显示软键盘

2023-08-04 12:16| 来源: 网络整理| 查看: 265

点击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()了。

打完收工~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有