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

打完收工~

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt中,要实现在点击文本框时弹出软键盘,可以通过以下步骤实现: 1. 创建一个文本框控件,并设置使其可编辑。 2. 为该文本框控件关联一个事件,例如 `mousePressEvent` 事件。 3. 在事件处理函数中,调用 `QWidget::setFocus()` 方法来使文本框控件获得焦点。 4. 利用 `QGuiApplication` 类的静态方法 `inputMethod()` 来获取键盘对象。 5. 调用键盘对象的 `show()` 方法,以显示软键盘。 示例代码如下: ``` #include <QApplication> #include <QLineEdit> #include <QMouseEvent> #include <QInputMethod> class MyLineEdit : public QLineEdit { public: MyLineEdit(QWidget *parent = nullptr) : QLineEdit(parent) {} protected: void mousePressEvent(QMouseEvent *event) override { QLineEdit::mousePressEvent(event); setFocus(); // 激活文本框焦点 QInputMethod *inputMethod = QGuiApplication::inputMethod(); inputMethod->show(); // 显示软键盘 } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyLineEdit lineEdit; lineEdit.setPlaceholderText("点击这里弹出软键盘"); lineEdit.show(); return app.exec(); } ``` 以上代码中,我们自定义了一个继承自QLineEdit的MyLineEdit类,并重写了鼠标点击事件。在鼠标点击事件中,我们首先调用`setFocus()`方法使文本框获得焦点,然后通过`QGuiApplication::inputMethod()`获取软键盘对象,并调用`show()`方法显示软键盘。 注意,软键盘显示和隐藏取决于操作系统和设备的设置,可能在某些设备上不起作用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值