Qt中在textEdit和LineEdit中使用enter键发送消息,捕获回车信号,实现登录界面和QQ发送消息的效果

1.在LineEdit中

1) 效果

假设一个用两个行编辑框和两个按钮构成一个登录界面。如下图所示

在这里插入图片描述

在这里使用行编辑框进行聚焦,需要达到的效果是按下键盘上的Enter键,就会自动触发“登录”按钮的槽函数,达到下图的效果。

在这里插入图片描述
因为Qt中响应快捷键的方式有三种

  • 信号与槽
  • 通过按钮控件的接口设置快捷键,如记事本中的ctrl+c和ctrl+v
  • 重写键盘相应函数

因为要求的不同,这里不再赘述其他的所有功能实现,所以博主这里使用一种一种简单的方法,调用Qt中已有的接口,快速实现功能。那应该怎样做到呢(😳),代码如下

2)实现代码

因为在widget界面和dialog界面中代码有所差异,所以这里将两者的差异区别给出

widget中
//在构造函数中添加如下代码
ui->button->setFocus; 
ui->button->setDefault(true);
dialog中
//在构造函数中添加如下一行代码即可
ui->button->setFocus;

使用LineEdit行编辑框中添加如上的不同代码即可实现按下Enter键响应

2.在textEdit中

1)效果

与lineEdit不同的是,textEdit文本编辑框自带有\n换行功能,所以在输入多文本的时候,使用Enter键就会跳转到下一行。
因为,这里给出了一种简单的解决方法,使用事件过滤器,写入鼠标响应事件,实现类似于QQ发送消息的功能,搭建的简易效果如下图

在这里插入图片描述
上面那个是显示文本框,下面则是输入文本框,在输入文本框中聚焦,输入文字,完毕之后按Enter键自动响应发送消息。

2)实现代码

头文件.h

//项目头文件中添加事件过滤器
protected:
    bool eventFilter(QObject *target, QEvent *event);//事件过滤器

实现文件.cpp

//构造函数中对其调用
ui->ButtonSend->setFocus();
ui->ButtonSend->setDefault(true);
ui->textEditWrite->installEventFilter(this);//设置完后自动调用其eventFilter函数
#include <QKeyEvent>		//需要添加头文件

//对其进行声明实现
bool ClientWidget::eventFilter(QObject *target, QEvent *event)
{
    if(target == ui->textEditWrite)		//可替换
        {
            if(event->type() == QEvent::KeyPress)//回车键
            {
                 QKeyEvent *k = static_cast<QKeyEvent *>(event);

                 if(k->key() == Qt::Key_Return)
                 {
                     on_ButtonSend_clicked();		//替换为需要响应的函数事件,以这里的按钮为例
                     return true;
                 }
            }
        }
        return QWidget::eventFilter(target,event);
}

 

布置完相关代码之后即可实现效果(嘻嘻😳)

参考

相关博文部分链接参考

3.更新

————————————时间分割线——————————
有访客来访留言说根据上述的思路在QTextEdit中无法实现文章中所描述的功能。现博主重新以一个小demo的实际例子,给出全部代码。先来看下效果

根据效果可以看见可以使用enter键直接发送文本信息。

1) 编译执行环境

  • win10
  • Qt 5.11
  • Qt Creator 4.7.1

2)构建简单的widget项目

博主这里以一个widget类的界面项目为例。创建好项目之后,在生成的ui界面使用两个QTextEdit和一个pushButton控件并并做好相应的命名,构建如下的界面

3)全部代码

  • widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>


namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

/***********************添加事件过滤器********************************/
protected:
    bool eventFilter(QObject *target, QEvent *event);//事件过滤器

/*******************************************************************/

private slots:
    void on_ButtonSend_clicked();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

  • widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QKeyEvent>		//需要添加头文件


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //构造函数中对其调用
    ui->ButtonSend->setFocus();
    ui->ButtonSend->setDefault(true);
    ui->textEdit->installEventFilter(this);//设置完后自动调用其eventFilter函数
}

Widget::~Widget()
{
    delete ui;
}

//实现事件过滤器
bool Widget::eventFilter(QObject *target, QEvent *event)
{
    if(target == ui->textEdit)
    {
        //获取按键信号
        if(event->type() == QEvent::KeyPress)
        {
             QKeyEvent *k = static_cast<QKeyEvent *>(event);
             if(k->key() == Qt::Key_Return)             //选定回车键(可自行定义其他按键)
             {
                 on_ButtonSend_clicked();               //链接槽信号
                 return true;
             }
        }
    }
    return QWidget::eventFilter(target,event);
}

//信号与槽  - 链接显示和输入文本框信息
void Widget::on_ButtonSend_clicked()
{
    QString msg = ui->textEdit->toHtml();
    ui->textEdit->clear();
    ui->textEdit->setFocus();
    ui->textBrowser->append(msg);
}

4.写在最后

本文介绍的例子很简单,就是使用使用事件过滤器,在其中自定义想要的按键响应信号,只需要修改很少的代码,即可成功实现功能。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值