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

来源:互联网 发布:top gear 知乎 编辑:程序博客网 时间:2024/06/04 23:37

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

这里写图片描述

1 0
原创粉丝点击