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

本文详细介绍了Qt中事件控制的五个层次,从重写事件处理函数到自定义事件的发送与处理,包括事件过滤器的安装和QCoreApplication::notify()的重写。通过对这些机制的理解,开发者可以更深入地掌控Qt应用程序的事件流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值