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

打完收工~

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐