首先回顾事件控制的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();
}
##最后输出