在QT中事件分为系统事件和自定义事件,可以看到QT跟MFC的消息很相似,MFC中消息也分为系统消息和用户自定的消息,下面来说明一下QT中自定义事件的实现方法。
1>自定义一个从QEvent派生的的类如,TestEvent,实现如下:
testEvent.h文件
- #ifndef TESTEVENT_H
- #define TESTEVENT_H
- #include <QEvent>
- class TestEvent : public QEvent
- {
- public:
- TestEvent();
- public:
- static const Type EventType;
- };
- #endif // TESTEVENT_H
testEvent.cpp文件
- #include "testevent.h"
- const QEvent::Type TestEvent::EventType = (QEvent::Type)QEvent::registerEventType(QEvent::User+100);
- TestEvent::TestEvent()
- : QEvent(EventType)
- {
- }
这样一个自定义的事件就完成了,有关事件的Type取值的问题请参考相关的资料,网上很多,比如
http://www.devbean.info/2012/10/qt-study-road-2-custom-event/
2>添加发送事件的代码
在main.cpp中如下:
- #include "mainwindow.h"
- #include <QApplication>
- #include "testevent.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- TestEvent tEvent;
- a.sendEvent(&w, &tEvent);
- return a.exec();
- }
这样应用程序就将tEvent所代表的事件发送给了w所代表的MainWindow。
3>添加事件处理代码:
主要是重写event函数
mainwindow.h文件中:
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- class TestEvent;
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = 0);
- ~MainWindow();
- protected:
- bool event(QEvent* event);
- void processTestEvent(TestEvent* event);
- };
- #endif // MAINWINDOW_H
mainwindow.cpp文件中:
- #include "mainwindow.h"
- #include "testevent.h"
- #include <QDebug>
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- }
- MainWindow::~MainWindow()
- {
- }
- bool MainWindow::event(QEvent* event)
- {
- if(event->type() == TestEvent::EventType)
- {
- qDebug()<<"event() is dispathing TestEvent";
- TestEvent* testEvent = static_cast<TestEvent* >(event);
- processTestEvent(testEvent);
- if(testEvent->isAccepted())
- {
- qDebug()<<"The testEvent has been handled!";
- return true;
- }
- }
- return QObject::event(event);
- }
- void MainWindow::processTestEvent(TestEvent* event)
- {
- qDebug("processTestEvent");
- event->accept();
- }
4>程序运行输出:
完。