Qt自定义事件的实现

来源:互联网 发布:郑州市儿童编程教育 编辑:程序博客网 时间:2024/06/05 04:01

看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event()函数,然后就可以调用QCoreApplication::sendEvent()或者QCoreApplication:;postEvent()发送事件就好了。

  1. #include <QtGui/QApplication>  
  2. #include <QCoreApplication>  
  3. #include <QEvent>  
  4. #include <QObject>  
  5. #include <QDebug>  
  6.   
  7. static const QEvent::Type MyEventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+100);  
  8.   
  9. //长官  
  10. class MyEvent: public QEvent  
  11. {  
  12. public:  
  13.     MyEvent(Type MyEventType):QEvent(MyEventType){}  
  14. };  
  15.   
  16. //信使  
  17. class MySender: public QCoreApplication  
  18. {  
  19. public:  
  20.     MySender(int argc,char *argv[]):QCoreApplication(argc,argv){}  
  21.   
  22. public:  
  23.     bool notify(QObject *receiver, QEvent *event);  
  24.   
  25. };  
  26.   
  27. bool MySender::notify(QObject *receiver, QEvent *event)  
  28. {  
  29.     if(event->type() == MyEventType)  
  30.     {  
  31.         qDebug()<<"MyEventType is coming!";  
  32.         //return true;  
  33.         /*这里不能return true,因为重写notify就是在事件被向下传递之前截住它, 
  34.         随便搞它,搞完了还得给QCoreApplication::notify向下传递,除非在mySender.notify 
  35.         实现了事件向下传递的那一套。直接返回的话myArmy就收不到这个事件,因为执行完这个 
  36.         mySender.notify的return true后,事件传递被人为的在半截终止了 
  37.         (见Qt事件处理的五个层次http://blog.csdn.net/michealtx/article/details/6865891 ) 
  38.         ,下面的myArmy的安装的过滤器和它自己的event都不会收到这个事件,更甭提最后干活 
  39.         的myEventHandler了。所以在主函数中执行完mySender.sendEvent把myEvent 
  40.         交给mySender.notify这个败家子儿后,就执行mySender.exec进入其它事件的循环了。这就是 
  41.         问题http://topic.csdn.net/u/20111012/19/78036d16-c163-40f9-a05c-3b7d6f4e9043.html 
  42.         出现的原因。感谢1+1=2大牛!非常感谢! 
  43.         */  
  44.     }  
  45.     return QCoreApplication::notify(receiver,event);  
  46. }  
  47.   
  48. //军队  
  49. class MyArmy: public QObject  
  50. {  
  51. public:  
  52.     void MyEventHandler(QEvent *event);  
  53.     bool event(QEvent *event);  
  54. };  
  55.   
  56. void MyArmy::MyEventHandler(QEvent *event)  
  57. {  
  58.     qDebug()<<"The event is being handled!";  
  59.     event->accept();  
  60. }  
  61.   
  62. bool MyArmy::event(QEvent *event)  
  63. {  
  64.     if(event->type() == MyEventType)  
  65.     {  
  66.         qDebug()<<"event() is dispathing MyEvent";  
  67.         MyEventHandler(event);//调用事件处理函数  
  68.         if((MyEvent*)event->isAccepted())  
  69.         {  
  70.             qDebug()<<"The event has been handled!";  
  71.             return true;  
  72.         }  
  73.     }  
  74.     return QObject::event(event);  
  75. }  
  76.   
  77. //监控者  
  78. class MyWatcher: public QObject  
  79. {  
  80. public:  
  81.     bool eventFilter(QObject *watched, QEvent *event);  
  82. };  
  83.   
  84. bool MyWatcher::eventFilter(QObject *watched, QEvent *event)  
  85. {  
  86.     if(event->type() == MyEventType)  
  87.     {  
  88.         qDebug()<<"I don't wanna filter MyEventType";  
  89.         return false;  
  90.     }  
  91.     return QObject::eventFilter(watched,event);  
  92. }  
  93.   
  94.   
  95. int main(int argc, char *argv[])  
  96. {  
  97.     //QCoreApplication a(argc, argv);  
  98.     MySender mySender(argc,argv);  
  99.   
  100.     MyArmy myArmy;  
  101.     MyWatcher myWatcher;  
  102.     myArmy.installEventFilter(&myWatcher);//安装事件过滤器  
  103.   
  104.     MyEvent myEvent(MyEventType);  
  105.     mySender.sendEvent(&myArmy,&myEvent);  
  106.     return mySender.exec();  
  107. }  


运行结果:


0 0