QT自定義事件的一個例子
阿新 • • 發佈:2018-11-04
QT自定義事件的一個例子
在QT中事件分為系統事件和自定義事件,可以看到QT跟MFC的訊息很相似,MFC中訊息也分為系統訊息和使用者自定的訊息,下面來說明一下QT中自定義事件的實現方法。
1>自定義一個從QEvent派生的的類如,TestEvent,實現如下:
testEvent.h檔案
- #ifndef TESTEVENT_H
- #define TESTEVENT_H
- #include <QEvent>
- class TestEvent :
- {
- 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>程式執行輸出:
完。