近期在又一次學習qt的時候,由於要涉及到子執行緒與主線程傳遞訊息,所以便琢磨了一下。順便把有用的記錄下來,方便自己以後查詢及各位同仁的參考!
特此宣告,本篇博文主要講述有用的,也就是直接說明怎麼實現,就不打算陳述一大堆理論啦,只是,還是建議大家去查查對應的理論比較好。這樣能對qt的訊息傳送機制的理解更加深入。
依據網上大多數人的資料,要實現自己定義訊息,須要從qevent 派生乙個自己定義的事件;事實上也能夠不須要,僅僅要使用qevent::type自己定義乙個事件即可了。
在這裡,本人把兩種實現方法都在這裡講述一下!
一、這裡先講述使用 qevent::type 定義乙個自己定義事件
1、新建乙個新的project 「myevent」 。在 ui 介面加入乙個button,並未button加入 onclick() 響應函式。
2、在 widget.h 標頭檔案使用 qevent::type 定義兩個自己定義事件。
3、又一次實現 event() 虛函式
bool event(qevent* e);
4、加入 #include
整個標頭檔案例如以下:
#ifndef widget_h
#define widget_h
#include #include namespace ui
class widget : public qwidget
;#endif // widget_h
5、使用qevent::
registereventtype
() 靜態函式為剛才兩個自己定義事件註冊值。
6、又一次實現 event() 函式 。
7、在 button響應函式裡面傳送時間訊息。
widget.cpp 檔案例如以下:
#include "widget.h"
#include "ui_widget.h"
qwidget(parent),
ui(new ui::widget)
widget::~widget()
bool widget::event(qevent* e)
else if(e->type() == myevent2)
return qwidget::event(e);
}void widget::on_pushbutton_clicked()
編譯執行後介面例如以下:
二、從 qevent 派生乙個自己定義事件類,類名取為 myevent 。
1、myevent.h 標頭檔案例如以下。裡面自己定義了三個自己定義事件,分別為 m_event1, m_event2, m_event3:
#ifndef myevent_h
#define myevent_h
#include class myevent : public qevent
;#endif // myevent_h
2 、在myevent.cpp 檔案裡面使用qevent
::registereventtype
() 為自己定義的事件註冊。
myevent.cpp 檔案例如以下:
#include "myevent.h"
#include qevent::type myevent::m_event1 = static_cast(qevent::registereventtype());
qevent::type myevent::m_event2 = static_cast(qevent::registereventtype());
qevent::type myevent::m_event3 = static_cast(qevent::registereventtype());
myevent::myevent(type e):qevent(e)
3、在 widget.cpp 檔案 加入 myevent.h 標頭檔案 。
4、改動 widget.cpp 檔案中面的button響應函式例如以下:
void widget::on_pushbutton_clicked()
5、
改動 widget.cpp 檔案中面的 event() 函式例如以下:
bool widget::event(qevent* e)
else if(e->type() == myevent2)else if(e->type() == myevent::m_event1) else if(e->type() == myevent::m_event2) return qwidget::event(e);}
然後又一次編譯執行,效果例如以下:
三 、 前面講的都是在主線程裡面傳遞事件訊息,接下來講述怎樣 在子執行緒裡面 往主線程 傳遞事件訊息。
1、從 qthread 派生乙個自己定義事件類,類名取為 mythread , 並又一次實現 run() 虛函式。mythread.h 標頭檔案例如以下:
#ifndef mythread_h2、在mythread.cpp 裡面又一次實現 run() 函式。在裡面實現向主線程傳送事件訊息,mythread.cpp 檔案例如以下:#define mythread_h
#include class mythread : public qthread
;#endif // mythread_h
#include "mythread.h"
#include "myevent.h"
qthread(parent)
void mythread::run()
3、在 widget.h 裡面加入
mythread.h 標頭檔案
, 然後定義乙個子執行緒物件, 例如以下:
#include
"mythread.h"
mythread
*m_pthread;
4、在堆記憶體裡面為
m_pthread
開闢乙個記憶體空間,例如以下:
widget::widget(qwidget *parent) :
qwidget(parent),
ui(new ui::widget)
5、在 ui 介面 加入還有乙個button。並為它加入 onclick() 事件響應。然後在裡面執行子執行緒,例如以下:
void widget::on_pushbutton_2_clicked()
編譯執行程式,效果例如以下:
::sendevent(); 的差別。
::::
sendevent(); 兩個函式,這裡可不是隨便使用的,這兩個函式時又差別的! ::
sendevent(); 依據qt asistant 裡面的講述。這個函式直接將事件訊息直接傳送給接受者進行處理,等到事件處理完成後才返回;而且使用它所傳遞的訊息事件是在 棧(stack) 上建立的,也就是說它的記憶體空間是有編譯器來自己主動管理的。 ::
postevent(); 依據qt asistant 裡面的講述,使用這個函式來傳遞時間訊息時。它將事件訊息傳送到接受者的的訊息佇列裡面,然後馬上返回。不須要等到事件處理完成才返回;而且使用它所傳遞的訊息事件是在 堆(heep) 上建立的。也就是說它的記憶體空間是又程式猿自己管理的,如用 new 建立的變數。
這兩個函式對事件的處理方式就像使用 repaint() 和 paint() 這兩個函式對介面進行重畫一樣。前者直接對介面進行重畫操作;後者先將重畫事件放到訊息佇列裡面,等到適當的時候在對介面進行重畫操作。 ::
postevent(); 函式。由於這裡必須保證在子執行緒退出之前,若子執行緒所傳遞的事件訊息還未被主線程處理的話,子執行緒所傳遞的訊息仍然是可用的。
好了。主線程內事件的傳遞與子執行緒向主線程傳遞事件訊息的方法就介紹到這裡了。至於qt 的事件傳送機制。這裡就沒有怎麼講了。只是還是建議讀者好好去了解一下的好。
Qt自定義事件的實現
後來我就想,那qt的發明人是怎麼定義事件的呢?其實站在qt發明人的角度,qevent就是他們的 自定義事件 ok!這就好辦了!看看qt發明人怎麼定義的qevent,看看他們怎麼用自己定義的qevent,不就回答了文章開頭的倆問題了嘛!o o 我把整個過程總結為 長官定義事件 信使傳遞事件 軍隊接收並...
Qt 自定義事件的實現
後來我就想,那qt的發明人是怎麼定義事件的呢?其實站在qt發明人的角度,qevent就是他們的 自定義事件 ok!這就好辦了!看看qt發明人怎麼定義的qevent,看看他們怎麼用自己定義的qevent,不就回答了文章開頭的倆問題了嘛!o o 我把整個過程總結為 長官定義事件 信使傳遞事件 軍隊接收並...
Qt 自定義事件
最近做的專案,是用qt的完成的,在用到事件派發的時候,要用自己自定義的事件型別來滿足需要。具體就是按照qt的官方文件說明,做了乙個簡單的例子,以免忘記,就先寫下來儲存。首先有個customevent 類,繼承自qevent ifndef customevent h define customeven...