QEvent postEvent/sendEvent

可以自訂事件類型,最簡單的方式,是透過QEvent::Type指定事件類型的常數值,在建構QCustomEvent時作為建構引數並透過postEvent()傳送事件,例如:


const QEvent::Type MyEvent = (QEvent::Type) 9393;
...
QApplication::postEvent(object, new QCustomEvent(MyEvent));


自訂事件必須定義事件號碼(Event number),自定義的事件號碼必須大於QEvent::Type的列舉值,通常1024以下的值是保留給Qt預先定義的事件類型來使用。object是事件的接受者,使用 postEvent()方法時,事件必須以new的方式建立,在事件處理完畢之後,會自動將事件deletepostEvent()會將事件放至事件佇列的尾端,然後立即返回。若要強迫Qt馬上處理先前postEvent()排到佇列的事件,則可以使用sendPostedEvents()。

您可以使用sendEvent()方法,事件會立即送至接受者,sendEvent()方法的事件不會被delete,所以通常建立在堆疊(Stack)區,例如:


CustomEvent event("Event Message");
QApplication::sendEvent(object, &event);


自訂的事件類型必須是QEvent的子類別,通常繼承QCustomEvent類別,建立自訂事件類別可以獲得更多的型態安全(Type safety)。

要處理自訂事件,可以重新定義customEvent()方法,例如:


void CustomWidget::customEvent(QCustomEvent *event) {
    CustomEvent *customEvent = static_cast<CustomEvent *>(event);
    ....
}


或是重新定義event()方法,將自訂事件分派給其它函式或直接在event()中處理,例如:


bool CustomWidget::event(QEvent *event) {
    if (event->type() == MyCustomEventType) {
        CustomEvent *myEvent = static_cast<CustomEvent *>(event);
        // 對自訂事件的處理,或呼叫其它函式來處理事件
        return true;
    }

    return QWidget::event(event);
}

 /**************************************************************/

呵呵,轉載了這麼多別人的關於Event方面的文章,我也來說說兩三句吧

前幾天一直被這個postEvent給困擾着,所以主要講解postEvent的個人理解吧,隨便稍微提一下其他的實現機制。

Qt中拋消息有:信號和槽、postEvent、sentEvent等機制,sentEvent只支持同步的。postEvent可以實現異步的,其機制是將消息發送到消息隊列中,消息隊列又會把這些消息都拋出(當然要實現該功能我們也可以用信號和槽機制,將connect函數的最後一個參數設置爲Qt::QueuedConnection即可)。

言歸正傳,上段我們說到消息隊列把消息拋出來,我們該如何去捕獲該消息呢?我們只要實現父類中的event()或者customEvent()函數即可,在裏面實現我們自己的處理,在此建議採用customEvent()。

以下是一個簡單的實例:

#include <QWidget>
#include <QEvent>

const QEvent::Type CustomEvent_Login = (QEvent::Type)5001;//建議用5000以上唯一的標識


class PostEvent : public QWidget
{
Q_OBJECT

public:
PostEvent(QWidget *parent = 0);
~PostEvent();

private:
void customEvent(QEvent *e);   //該函數是父類QWidget的虛函數

};

PostEvent::PostEvent(QWidget *parent)
{
QApplication::postEvent(this, new QEvent(CustomEvent_Login));   //該函數實現將自定義的消息發送到隊列,且new QEvent(CustomEvent_Login))只能動態分配,原因請看Qt的幫助文檔中的postEvent函數說明。
}

void PostEvent::customEvent(QEvent *e)
{
if (e->type() == CustomEvent_Login)   //捕獲消息
{
   QMessageBox msgBox;
   msgBox.setText("The document has been modified.");
   msgBox.exec();
}
}

呵呵,就這樣吧 本人一開始犯了一個很白癡的錯誤,即把customEvent函數當作用戶可以自定義的函數,殊不知是父類中的虛函數,所以一直捕獲不到消息。好了,以上只是一個簡單的關於postEvent的一個應用,如果想了解更多的消息機制請閱讀其他關於event的文章。

發佈了14 篇原創文章 · 獲贊 15 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章