我是靠谱客的博主 傻傻胡萝卜,最近开发中收集的这篇文章主要介绍Qt事件分发及过滤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);
}

最后

以上就是傻傻胡萝卜为你收集整理的Qt事件分发及过滤Qt事件分发及过滤的全部内容,希望文章能够帮你解决Qt事件分发及过滤Qt事件分发及过滤所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部