Qt事件分发及过滤

本文详细介绍了Qt中的事件处理机制,包括事件分发、事件过滤和事件拦截。通过重写`event()`函数实现事件拦截,阻止事件的进一步分发,以及利用事件过滤器在事件分发前进行高级拦截。示例代码展示了如何在`myLabel`部件中拦截鼠标点击事件,并在过滤器中处理。这种方法可以用于自定义事件行为,但不建议频繁使用,因为可能影响正常事件流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt事件分发及过滤

当我们的程序发现一个事件的时候,并不是立即调用事件函数,而是全部交由分发器event()处理。event()返回的数据类型是bool类型,如果event()返回的结果是true表示用户要自己处理事件,event()就不会向下分发。

所以我们可以利用event()做事件的拦截(不建议)

事件拦截

例:在myLbel部件中拦截鼠标点击事件

// 鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
    if (ev->button() == Qt::LeftButton) {
        QString str = QString("鼠标按下了,x = %1 y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
    }
}

// 重写event()
bool myLabel::event(QEvent * e) {
    // 如果是鼠标按下事件,在这里拦截
    if (e->type() == QEvent::MouseButtonPress) {
        // 事件类型转换
        QMouseEvent * ev = static_cast<QMouseEvent *>(e);
        
        // 处理事件
        QString str = QString("myLabel::event()中鼠标按下了,x = %1 y = %2").arg(ev->x()).arg(ev->y());
        qDebug() << str;
        
        // 不再向下分发
        return true;
    }
    
    // 其他事件交给父类处理(默认处理)
    return QLabel::event(e);
}

事件过滤器

从程序发现事件到事件分发器之间,实际上还可以有一个环节——事件过滤器。通过事件过滤器,可以在程序分发到event之前再做一次高级拦截。

使用方法:

  1. 给控件安装事件过滤器
  2. 重写eventfilter
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
	
    // 添加过滤器
    ui->label->installEventFilter(this);
}

// 重写过滤器
bool Widget::eventFilter(QObject * obj,QEvent * e) {
    //判断控件
    if (obj == ui->label) {
        // 判断事件
        if (e->type() == QEvent::MouseButtonPress) {
            QMouseEvent * ev = static_cast<QMouseEvent *>(e);
            QString str = QString("事件过滤器中鼠标按下了,x = %1 y = %2").arg(ev->x()).arg(ev->y());
            qDebug() << str;

            return true;
        }
    }
    
    //其他事件默认处理
    return QWidget::eventFilter(obj,e);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值