事件处理(事件过滤器)

事件过滤器(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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柔弱胜刚强.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值