在QT中事件分为系统事件和自定义事件,可以看到QT跟MFC的消息很相似,MFC中消息也分为系统消息和用户自定的消息,下面来说明一下QT中自定义事件的实现方法。

1>自定义一个从QEvent派生的的类如,TestEvent,实现如下:

testEvent.h文件

 
  
  1. #ifndef TESTEVENT_H 
  2. #define TESTEVENT_H 
  3.  
  4. #include <QEvent> 
  5.  
  6. class TestEvent : public QEvent 
  7. public
  8.     TestEvent(); 
  9.  
  10. public
  11.     static const Type EventType; 
  12. }; 
  13.  
  14. #endif // TESTEVENT_H 

testEvent.cpp文件

 
  
  1. #include "testevent.h" 
  2.  
  3. const QEvent::Type TestEvent::EventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+100); 
  4.  
  5. TestEvent::TestEvent() 
  6.     : QEvent(EventType) 

这样一个自定义的事件就完成了,有关事件的Type取值的问题请参考相关的资料,网上很多,比如

http://www.devbean.info/2012/10/qt-study-road-2-custom-event/

2>添加发送事件的代码

在main.cpp中如下:

 
  
  1. #include "mainwindow.h" 
  2. #include <QApplication> 
  3. #include "testevent.h" 
  4.  
  5. int main(int argc, char *argv[]) 
  6.     QApplication a(argc, argv); 
  7.     MainWindow w; 
  8.     w.show(); 
  9.  
  10.     TestEvent tEvent; 
  11.     a.sendEvent(&w, &tEvent); 
  12.     return a.exec(); 

这样应用程序就将tEvent所代表的事件发送给了w所代表的MainWindow。

3>添加事件处理代码:

主要是重写event函数

mainwindow.h文件中:

 
  
  1. #ifndef MAINWINDOW_H 
  2. #define MAINWINDOW_H 
  3.  
  4. #include <QMainWindow> 
  5.  
  6. class TestEvent; 
  7.  
  8. class MainWindow : public QMainWindow 
  9.     Q_OBJECT 
  10.      
  11. public
  12.     MainWindow(QWidget *parent = 0); 
  13.     ~MainWindow(); 
  14.  
  15. protected
  16.     bool event(QEvent* event); 
  17.     void processTestEvent(TestEvent* event); 
  18. }; 
  19.  
  20. #endif // MAINWINDOW_H 

mainwindow.cpp文件中:

 
  
  1. #include "mainwindow.h" 
  2. #include "testevent.h" 
  3. #include <QDebug> 
  4.  
  5. MainWindow::MainWindow(QWidget *parent) 
  6.     : QMainWindow(parent) 
  7.  
  8. MainWindow::~MainWindow() 
  9.      
  10.  
  11. bool MainWindow::event(QEvent* event) 
  12.     if(event->type() == TestEvent::EventType) 
  13.     { 
  14.         qDebug()<<"event() is dispathing TestEvent"
  15.  
  16.         TestEvent* testEvent = static_cast<TestEvent* >(event); 
  17.         processTestEvent(testEvent); 
  18.  
  19.         if(testEvent->isAccepted()) 
  20.         { 
  21.             qDebug()<<"The testEvent has been handled!"
  22.             return true
  23.         } 
  24.     } 
  25.  
  26.     return QObject::event(event); 
  27.  
  28.  void MainWindow::processTestEvent(TestEvent* event) 
  29.  { 
  30.      qDebug("processTestEvent"); 
  31.      event->accept(); 
  32.  } 

4>程序运行输出:

完。