事件过滤器(eventFliter)
- Qt提供了事件过滤器来在一个部件中监控其他多个部件的事件。
- 事件过滤器与其他部件不同,他不是一个类。
- 只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监视!
- 这两个函数分别是installEventFilter()和eventFilter()
- 他们都是QObject类中的函数。
- 使用事件过滤器可以很容易的处理多个部件的事件
来点实战:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 为子部件安装事件过滤器(其实就是允许父窗口监视自己)
ui->textEdit->installEventFilter(this);
ui->spinBox->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
// 监视 textEdit 子部件的事件
if(watched == ui->textEdit)
{
// 监视 textEdit 子部件的 wheel 事件
if(event->type() == QEvent::Wheel)
{
QWheelEvent *wheelEvt = static_cast<QWheelEvent*>(event);
if(wheelEvt->delta() > 0)
{
ui->textEdit->zoomIn();
}
if(wheelEvt->delta() < 0)
{
ui->textEdit->zoomOut();
}
// 不允许事件的继续传递
// 阻断事件的传递
return true;
}
}
// 监视 spinBox 子部件的事件
if(watched == ui->spinBox)
{
// 监视 spinBox 子部件的键盘按下事件
if(event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvt = static_cast<QKeyEvent*>(event);
if(keyEvt->key() == Qt::Key_M)
{
ui->spinBox->setValue(99);
}
}
return true;
}
return QMainWindow::eventFilter(watched,event);
}
MainWindow里的 eventFliter 监视着 textEdit 和 spinBox 的事件,所以完全可以在 MainWindow 里面阻断/处理所有子部件的所有类型的消息!
参考:
不二如是:https://fishc.com.cn/forum.php?mod=viewthread&tid=77543&ctid=447