Qt事件分发及过滤

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、付费专栏及课程。

余额充值