C++自定义event实现消息触发

        在QT中,可以通过信号-槽机制实现两个类之间的事件触发。但是c++中没有这样的机制。通过自定义event的方式,可以实现一个类对象通知事件的触发。

        下面的例子是一个通过MySingleton的event触发MainWindow方法的实例。

             ①event类中通过重载+=和()运算符提供方法的注册和执行;

             ②MySingleton类中定义event变量,并提供runMethod()方法触发消息;

             ③在MainWindow中定义事件执行方法func并注册到event中;

             ④在MainWindow中通过按钮调用MySingleton类的runMethod()方法触发消息。

         以下是关键部分代码:

        1、定义event类

              myevent.h

                  typedef void(FUNC_TYPE)(MyEventParam* event_args);

                 class MyEvent{

                 public:

                       MyEvent();

                       void operator+=(FUNC_TYPE*);

                       void operator()(MyEventParam* event_args);

                       QList<FUNC_TYPE*> m_methodList;  };

             myevent.cpp

                 void MyEvent::operator+=(FUNC_TYPE* pFunc) {

             m_methodList.append(pFunc);    }

                void MyEvent::operator()(MyEventParam* event_args) {

                        FUNC_TYPE* pFunc;

             for(int i=0;i<m_methodList.count();i++) {
                 pFunc = m_methodList.at(i);
                 pFunc(event_args);  }

                }

        2、在MySingleton定义event变量

              class TestParam : public MyEventParam {

           public:
               TestParam();
               int m_id;
               QString m_name;
      };

            public:

            static MyEvent m_event;

              void MySingleton::runMethod() {

            TestParam mparam;
            mparam.m_id = 0;
            mparam.m_name = "test";
            m_event(&mparam);
       }

        3、在MainWindow中注册event触发的方法

              FUNC_TYPE* pFun = (void(*)(MyEventParam* event_args))func;

       MySingleton::m_event += pFun;

        4、在MainWindow中定义事件处理方法func

             void MainWindow::func(MyEventParam* event_args) {

          TestParam* mParam = (TestParam*)event_args;
          qDebug() << "do function.id=" << mParam->m_id << " name=" << mParam->m_name;

             }

        5、在MainWindow中通过按钮触发MySingleton的事件

              这里的触发可以放到任何类中进行,不一定是在MainWindow中。

              void MainWindow::on_pushButton_clicked() {

           MySingleton::getinstance()->runMethod();

             }

            执行效果:

            

讨论QT技术问题可加QQ群:462331087

              

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值