QObject Event( )customEvent( ) 函式區別

keleman發表於2024-11-19
事件處理流程中的角色

event函式

        event函式是QObject中事件處理的總入口。當有任何事件傳遞到一個QObject或者它的派生類物件時,這個函式首先被呼叫。它就像是一個事件排程中心,負責接收各種各樣的事件,並根據事件的型別把它們分發給對應的具體處理函式。
        例如,對於滑鼠按下事件(QEvent::MouseButtonPress)、鍵盤按鍵事件(QEvent::KeyPress)等常見事件,event函式會檢查事件型別,然後呼叫相應的特定事件處理函式,如mousePressEvent、keyPressEvent等。

customEvent函式

        customEvent函式主要用於處理自定義事件。當開發者定義了自己的事件型別(透過繼承QEvent類),並使用QCoreApplication::postEvent或QCoreApplication::sendEvent來傳送這些自定義事件時,customEvent函式就會發揮作用。它是一個專門為處理自定義事件而預留的函式。
事件型別的關聯
    event函式
        處理所有型別的QEvent及其派生類事件。它可以識別多種預定義的標準事件型別,如定時器事件(QEvent::Timer)、視窗啟用事件(QEvent::WindowActivate)等眾多事件型別。透過對event->type()返回值的判斷,可以將事件分發給對應的處理邏輯。
    customEvent函式
        通常關聯自定義事件型別。自定義事件型別的值一般是大於QEvent::User的整數(QEvent::User是一個用於自定義事件的起始標記)。當event函式判斷出傳入的事件型別是自定義事件型別時,會將事件傳遞給customEvent函式進行處理。
使用場景
    event函式
        適用於對標準事件的集中處理和分發。如果需要在物件級別對所有傳入的事件進行統一的前置處理,或者修改事件的處理流程(比如攔截某些事件或者修改事件引數後再分發),就可以在event函式中實現。例如,在一個視窗類中,可以在event函式中記錄所有事件的發生時間,用於效能分析或者事件日誌記錄。
    customEvent函式
        用於處理應用程式特定的自定義事件邏輯。比如在一個複雜的多執行緒圖形應用程式中,自定義一個事件用於通知某個圖形物件需要從後臺執行緒更新其資料。透過自定義事件和customEvent函式,可以在不干擾標準事件處理流程的情況下,實現特定的、應用程式獨有的互動邏輯。
示例程式碼對比
    event函式示例

bool MyWidget::event(QEvent *event)
{
if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent mouseEvent = static_cast<QMouseEvent>(event);
if (mouseEvent->button() == Qt::LeftButton)
{
qDebug() << "Left mouse button pressed";
return true;
}
}
return QWidget::event(event);
}

這個event函式在MyWidget類中重寫,用於處理滑鼠按下事件。當檢測到滑鼠左鍵按下時,輸出一條除錯資訊,並返回true表示事件已經被處理;否則,將事件傳遞給基類QWidget的event函式繼續處理。
customEvent函式示例

cpp
複製

class MyCustomEvent : public QEvent
{
public:
MyCustomEvent(int data) : QEvent(static_castQEvent::Type(QEvent::User + 1)), m_data(data) {}
int getData() const { return m_data; }
private:
int m_data;
};
void MyWidget::customEvent(QEvent *event)
{
if (event->type() == QEvent::User + 1)
{
MyCustomEvent customEvent = static_cast<MyCustomEvent>(event);
qDebug() << "Custom event data: " << customEvent->getData();
}
}

首先定義了一個自定義事件類MyCustomEvent,它繼承自QEvent,並帶有一個自定義的資料成員。在MyWidget類的customEvent函式中,當接收到自定義事件型別(QEvent::User + 1)的事件時,將事件轉換為MyCustomEvent型別,然後獲取並輸出其中的資料。

對於自定義事件 User+n 可以只過載定義 customEvent函式 ,系統會自動呼叫。

對於如果要監聽系統事件則需要過載 event函式

相關文章