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();
}