Qt学习之路(10):自定义事件与事件控制的5大层次

首先回顾事件控制的5个层次:

1. 重写paintEvent()、mousePressEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。

2. 重写event()函数。event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。

3. 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。

4. 在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。

5. 重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)。

========================================================================

自己定义事件:首先需要从QEvent派生出一个类来,然后通过Qt的API函数发送,最后自己在相应的接收方进行处理.

[1]自己定义一个事件

#ifndef CUSTOMEVENT
#define CUSTOMEVENT
#include "QEvent"
#define MyType static_cast<QEvent::Type>(QEvent::User+12)//QEvent::registerEventType(1999)
class MyCustomEvent:public QEvent
{
public:
  MyCustomEvent():QEvent(MyType),name("hmmm"){}

public:
      QString name;
};
#endif // CUSTOMEVENT
bool MainWindow::eventFilter(QObject* obj,QEvent* event)
{

      if(event->type()==MyType)
    {
        qDebug()<<"EventFilter";
        return false;//这里是为了继续让handler处理
    }
 return QMainWindow::eventFilter(obj,event);//不确定是否还有其他的时间过滤,调用父类的函数
}
/****************重写自定义事件的handler********************/
void MainWindow::customEvent(QEvent* event)
{
    if(event->type() == MyType)//如果等于我们自定义的事件,那么就处理它
        {
        auto Myevent = static_cast<MyCustomEvent*>(event);
        qDebug()<<":"<<Myevent->name;
    }
}
/*******************在event函数里面处理******************/
bool MainWindow:: event(QEvent* event)
{
    if(event->type()==MyType)
    {
        qDebug()<<"event() is processiing the MyCustomEvent";
    }
    return QMainWindow::event(event);
}
//main.cpp
#include <QApplication>
#include "mainwindow.h"
#include "QMenuBar"
#include "QSpinBox"
#include "QWidget"
#include "QSlider"
#include "QHBoxLayout"
#include "eventlabel.h"
#include "memory"
#include "customevent.h"
#include "QCoreApplication"
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
     MainWindow w;
     MyCustomEvent event;//生成一个自定义的时间对象
     QWidget  s;
     w.show();
     a.installEventFilter(&w);//向整个程序添加事件过滤器
     w.installEventFilter(&w);//将主窗口上加载自己的事件过滤器
     QCoreApplication::sendEvent(&w,&event);
    return a.exec();
}
##最后输出

这里写图片描述

你可能感兴趣的:(Qt学习之路(10):自定义事件与事件控制的5大层次)