Qt事件機制的小實驗

2021-08-15 06:47:26 字數 2099 閱讀 8016

mymessageevent.h

#ifndef myevent

#define myevent

#include

#include

class mymessageevent:public qevent

void setmessage(qstring _m)

qstring getmessage()

private:

qstring m_message;

int m_type = static_cast

(qevent::user) + 1;

};#endif // !myevent

messageui.h

#ifndef messageui

#define messageui

#include

#include

#include

#include

#include

#include "mymessageevent.h"

class messageui : public qwidget

protected:

void customevent(qevent * event)

private:

qgridlayout m_layout;

qlabel *m_plabel;

};class clasmessagethread : public qthread

//事件迴圈

exec();

}public:

void setmessageui(messageui * _ui)

private:

messageui * m_pui=nullptr;

};#endif

main

#include "messageui.h"

int main(int argc, char *argv)

執行這個程式,期望執行緒t的run方法能夠直接將棧上的訊息傳送給gui執行緒建立的ui:

void run() q_decl_override

//事件迴圈

exec();

}

可得到的卻是這樣乙個斷言: 

斷言上說,不能直接將事件傳送給乙個不屬於當前執行緒的物件。

是的!

不能直接將事件傳送給乙個不屬於當前執行緒的物件。

qt庫保證乙個物件的事件處理器以及非直接連線的槽函式都只能在擁有這個物件的執行緒中執行,如果乙個物件不屬於某乙個執行緒,那就不允許這個執行緒執行它的這些函式。 

checkreceiverthread會檢查receiver所屬的執行緒,若不是當前執行緒,就引發上面的斷言。

我們改改run方法,這次不使用sendevent,而是使用postevent,看看有什麼不一樣:

void run() q_decl_override

exec();

}

執行結果:

所以,postevent完美的實現了執行緒間的事件的傳送。

postevent能夠完成事件的傳送是因為他完全遵守上面所說的qt的設計原則:

qt庫保證乙個物件的事件處理器以及非直接連線的槽函式都只能在擁有這個物件的執行緒中執行,如果乙個物件不屬於某乙個執行緒,那就不允許這個執行緒執行它的這些函式。

當前執行緒呼叫sendevent時,會直接將事件一路傳遞到最終的處理器進行處理,處理完成後返回,事件的處理是同步的,如果receiver所在的執行緒和當前執行緒不是同乙個執行緒,則會觸發上面的斷言。

qt 事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...

QT事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 到現在為至,我們所說的內容不僅僅適用於key事件,也適用...

qt事件機制

coffeegg qt事件機制 學習了一段時間的qt之後,發現qt的事件機制和其他語言的機制有些不同。qt除了能夠 通過訊號和槽機制來實現一些action動作之外,還可以用物件所帶的事件,或者使用者自 定義的事件來實現物件的一些行為處理。現在,我們從頭開始講解。到底什麼是事件呢?事件起源 基於事件如...