【Qt从入门到入土】8.事件机制

1.什么是事件

简单来说QEvent就是qt的事件,操作界面每个控件的动作都会产生相对的事件。

事件分为两种:主动(QMouseEvent等)和被动(TimeEvent),无论是什么事件,最后都会走到Qt的event事件来进行分发。

2.事件的传递过程

当用户操作时,操作系统会产生一个系统消息,该消息会被Qt捕获,然后转换成QEvent事件,并调用QObject::event()将该对象分发下去,然后会进行事件过滤(Event Filter),然后分发给合适的对象,最后在事件中执行相应的动作。

3.事件过滤器

Qt的事件过滤由以上两个方法实现,首先安装一个事件过滤器,然后重写bool eventFilter(QObject *obj, QEvent *event)。
Obj表示事件筛选器对象,它接收发送到此QObject对象的所有事件。筛选器可以停止事件,也可以将事件转发给此QObject对象。事件过滤器filterObj通过它的eventFilter()函数接收事件。

void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event);

eventFilter()有返回值。
如果返回true,表示事件过滤,不会发送到对象本身。
如果返回false,表示事件未过滤,会通过event()方法将事件分发到对象。
返回给基类进行处理,例:return QObject::eventFilter(obj, event)。

//过滤鼠标事件给QLabel
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
    if(obj == ui->label)
    {
        //鼠标进入的时候
        if (event->type() == QEvent::Enter)
        {
            ui->label->setText("进入");
            return true;
        }
        else if(event->type() == QEvent::Leave) //鼠标离开
        {
            ui->label->setText("离开");
            return true;
        }
        return false;//别的事件会传给label对象
    }
    return QWidget::eventFilter(obj, event);
}

4.捕获全局事件

//继承QApplication重写notify事件,notify是所有事件的入口。
bool myApplication::notify(QObject *obj, QEvent *event)
{
    if(event->type() == QMouseEvent::MouseButtonPress)//可以设置此处的event->type()来捕获不同类型的event事件
    {
        
 
    }
    else if(event->type() == QEvent::NonClientAreaMouseButtonRelease)
    {
        
    }
 
    return QApplication::notify(obj,event);
}
 
//main.cpp

#include "mainwindow.h"
#include <QApplication>
#include "myapplication.h"
int main(int argc, char *argv[])
{
    myApplication a(argc, argv);  //注意此处是用myApplication构造 不是QApplication
    MainWindow w;
    w.show();
 
    return a.exec();
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值