10、event函数、事件过滤器

1、event函数将获取到的事件,交给对应的处理函数;实现事件分发,基于此,可以实现一些事件的过滤;

2、重写event()函数,返回值bool类型  type()类型触发哪一种事件

// 声明event函数
bool event(QEvent *ev);

3、事件处理

// 返回值true事件表示接受 不继续传递
bool myWidget::event(QEvent *ev)
{
    // 实现事件分发
   /*  这种实现暂时说明意思
    * switch(ev->type())
    {
        case QEvent::Close:
            QCloseEvent *ce = static_cast<QCloseEvent*>(ev);
            closeEvent(ce);
        break;
    case QEvent::MouseMove:
        // 需要做类型转换
        //mouseMoveEvent(ev);
        break;
    }*//*
    if(ev->type() == QEvent::Timer)
    {
        // 可以屏蔽掉定时器
        return true;
    }else if{
        return QWidget::event(ev);  // 其他事件继续传递
    }else */

    // 事件过滤
    QKeyEvent *env = static_cast<QKeyEvent*>(ev);
    if(env->type() == QEvent::KeyPress)
    {
        // 只处理该事件
        return QWidget::event(env);
    }else {//
        return QWidget::event(env);
    }
}

不要轻易动event() 函数;

4、事件过滤器eventFilter()

bool eventFilter(QObject *w, QEvent *e);

控件安装事件过滤器

ui->label->installEventFilter(this);

事件处理

// 事件过滤器
bool myWidget::eventFilter(QObject *w, QEvent *e)
{
    if(w== ui->label)
    {
        if(e->type() == QEvent::MouseMove)
        {
            // 对该事件做处理
            // 处理完事件后,不需要事件继续传播
            return true;
        }else
        {
             // 事件继续传播
            return QWidget::eventFilter(w,e);
        }
    }else {
        return QWidget::eventFilter(w,e);
    }
}                    

事件过滤器和被安装过滤器的控件必须在同一个线程,否则过滤器无效;

 

posted @ 2020-07-31 18:43  笑不出花的旦旦  阅读(281)  评论(0编辑  收藏  举报