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