就是对某个控件的事件进行过滤,用来改变它原有的行为,比如QLineEdit这个控件我输入一个字母A,控件中就会出现一个字母A,如果我想改变QLineEdit这个行为,我想输入输入A,显示B。正常情况下,我们可以自定义一个类,这个类继承QLineEdit,然后重写keyPressEvent方法,但是如果项目中很多控件都需要这种处理方式,我们可以使用事件过滤器统一改变。
上效果图
实现方式:
1 在目标对象上调用installEventFilter(),注册监视对象。
2.在监视对象的eventFilter()函数中处理目标对象的事件。
上代码:
头文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
virtual bool eventFilter(QObject *, QEvent *);
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
源文件
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QKeyEvent>
#include <QString>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->textEdit->installEventFilter(this);
}
Dialog::~Dialog()
{
delete ui;
}
bool Dialog::eventFilter(QObject *obj, QEvent *event)
{
if(obj == ui->textEdit)
{
if(event->type() == QEvent::KeyPress)
{
qDebug()<<"sss";
QKeyEvent *keyEvent =(QKeyEvent *)(event);
if(keyEvent->key() == Qt::Key_A)
{
ui->lineEdit->clear();
ui->lineEdit_2->clear();
ui->textEdit->clear();
ui->lineEdit->setText(("输入的是A"));
ui->lineEdit_2->setText(("显示的是B"));
ui->textEdit->setText("B");
}
}
}
}