qt随手记:实现自定义事件,类似MFC的消息循环

本文介绍了在Qt中如何自定义事件类型myLightEvent,用于简化开关灯控制的业务流程。通过创建myLightEvent类并注册事件类型,然后在lightDPS类中重写event方法来处理自定义事件。在业务流程中,可以使用QCoreApplication::postEvent发送myLightEvent,以控制灯的开关状态,避免频繁使用信号和槽导致的复杂性。
摘要由CSDN通过智能技术生成

关于qt自定义事件的理论知识,请参考如下博文,我直接贴代码
参考一、https://www.cnblogs.com/liushui-sky/p/5733525.html
参考二、http://blog.chinaunix.net/uid-24219701-id-4044098.html

场景描述,lightDPS是开关灯的控制类,在应用程序中需要在多个业务流程中对灯进行开关控制,虽然使用信号和槽也能实现,但当业务流程增加时,又得定义信号/槽,不如使用事件简洁方便。
事件类myevent.h

#ifndef MYEVENT_H
#define MYEVENT_H
#include <QObject>
#include <QEvent>
//声明、定义、注册自定义事件类型,事件ID为自定义事件ID起点QEvent::User +100=1100

class myLightEvent : public QEvent
{
public:
    myLightEvent() : QEvent(myLightEvent::type())
    {}

    virtual ~myLightEvent()
    {}

    static QEvent::Type type()
    {
        if (lightEventType == QEvent::None)
        {
            int generatedType = QEvent::registerEventType(QEvent::User+100);
            lightEventType = static_cast<QEvent::Type>(generatedType);
        }
        return lightEventType;
    }
    void setLightAction(int action)
    {
        lightAction = action;
    }
    int getLightAction()
    {
        return lightAction;
    }
private:
    int lightAction;
    static QEvent::Type lightEventType;
};


//监控者
class MyWatcher: public QObject
{
public:
    bool eventFilter(QObject *watched, QEvent *event)
    {
        if(event->type() == myLightEvent::type())
        {
            //"I don't wanna filter MyEventType";
            return false;
        }
        return QObject::eventFilter(watched,event);
    }
};

#endif // MYEVENT_H

myevent.cpp文件:

#include "myevent.h"

QEvent::Type myLightEvent::lightEventType = QEvent::None;

lightDPS.h中的大概内容:

class lightDPS : public QObject
{
    Q_OBJECT
  public:
    bool event(QEvent *event);//重写event事件
}

lightDPS.cpp中的内容:

bool lightDPS::event(QEvent *event)
{
    if(event->type() == myLightEvent::type())
    {
        //qDebug()<<"event() is dispathing MyEvent";
        myLightEvent *lightEvent = static_cast<myLightEvent *>(event);
        openLight(lightEvent->getLightAction());//开关灯的处理操作
        event->accept();//接受事件,不再转发
        if((myLightEvent*)event->isAccepted())
        {
            qDebug()<<"The event has been handled!";
            return true;
        }
    }
    return QObject::event(event);//非本对象处理的事件,返回给父对象处理
}

在业务流程中的调用,比如某个cpp中:

myLightEvent*  mylightevent = new myLightEvent();//QT框架自动释放内存
mylightevent->setLightAction(lightDPS::OPEN_FILL);
QCoreApplication::postEvent(lightDPS::GetInstance(),mylightevent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值