qt事件原理

2021-09-19 20:49:28 字數 2858 閱讀 7316

若對c++語法不熟悉,建議參閱《c++語法詳解》一書,電子工業出版社出版,該書語法示例短小精悍,對查閱c++知識點相當方便,並對語法原理進行了透徹、深入詳細的講解,可確保讀者徹底弄懂c++的原理,徹底解惑c++,使其知其然更知其所以然。此書是一本全面了解c++不可多得的案頭必備圖書。

2.6.2 qt對事件的描述及分類

事件是由程式內部或外部產生的事情或某種動作的通稱。比如使用者按下鍵盤或滑鼠,就會產生乙個鍵盤事件或滑鼠事件(這是由程式外部產生的事件);再如,當視窗第一次顯示時,會產生乙個繪製事件,以通知視窗需要重新繪製其自身,從而使該視窗可見(這是由程式內部產生的事件)。

事件和訊號的區別

 他們兩個是不同的概念,不要弄混淆。訊號是由物件產生的,而事件則不一定是由物件產生的(比如由滑鼠產生的事件),事件通常來自底層的視窗系統,但也可以手動傳送自定義的事件,可見訊號和事件的**是不同的。

 事件既可以同步使用,也可以非同步使用 (取決於呼叫sendevent()還是 postevents()),而使用訊號和槽總是同步的。事件的另乙個好處是可以被過濾。

qt中使用qevent及其子類來描述事件(其繼承關係見圖2-7),比如qmouseevent類用於描述與滑鼠相關的事件,qkeyevent描述了與鍵盤相關的事件等

根據事件的**和傳遞方式,事件可分為以下三大類

 自發事件:這是由視窗系統生成的,這些事件置於系統佇列中,並由事件迴圈乙個接乙個地處理。

 發布的事件(posted events):該類事件由qt或應用程式生成,這些事件由qt排隊,並由事件迴圈處理。

 傳送的事件(sent events):該類事件由qt或應用程式生成,這些事件直接傳送到目標物件,不經過事件迴圈處理。

事件還可被細分為很多種型別(有一百多種),每一種型別使用qevent類中的列舉常量進行表示,比如qmouseevent管理的滑鼠事件有滑鼠雙擊、移動、按下等型別,這些型別分別使用qevent::type列舉型別中的列舉常量mousebuttondblclick、mousemove、mousebuttonpress表示。所有的型別分類請查閱幫助文件。可使用函式 type qevent::type() const;獲取事件的型別

使用qt程式設計幾乎不需考慮事件,因為當產生某種事件時,qt視窗部件都會發射乙個相應的訊號(即qt會把事件轉換為乙個對應的訊號),比如按鈕被按下時,會產生乙個mousebuttonpress事件,qt會處理這一事件,並且會發射乙個clicked()單擊訊號,程式設計師可以直接處理clicked()訊號,而不必處理底層的事件。

我們不需要知道qt是怎樣把事件轉換為qevent或其子類型別的物件的,程式設計師只需要知道怎樣傳遞和處理這些事件即可。比如對於按下滑鼠事件,不需要知道qt是怎樣把該事件轉換為qmouseevent型別的物件的,只需要知道怎樣傳遞和處理該事件即可。

2.6.3 事件的傳遞(或分發)及處理

bool qwidget::event(qevent *event) 

…… }

class a:public qwidget;//事件處理方式2:重寫qwidget類中的事件處理函式

bool a::event(qevent* e); //重寫虛函式qobject::event()

bool notify(qobject *o,qevent *e);}; //重寫虛函式notify

bool a::event(qevent* e);//子類化qwidget

class c:public qpushbutton; //子類化標準按鈕qpushbutton

bool a::event(qevent* e)

程式執行結果(見圖2.11)及說明

當在按鈕上按下滑鼠鍵時,呼叫c::event()函式輸

出mc=mousedown,此時該函式返回1,表示事件不

再傳遞。但是該函式並未處理滑鼠釋放事件,因此呼叫qwidget::event()對該事件作預設處理,因預設未處理該事件,因此呼叫mc的父物件ma處理該事件,此時呼叫a::event()函式輸出ma=mouserelease,至此滑鼠事件處理結束。

當按鈕獲得焦點,按下鍵盤上的按鍵時的處理方式與滑鼠事件類似,只是c::event()函式直接把鍵按下事件傳遞給了父物件ma處理。

2.6.4 事件的接受和忽略

class a:public qwidget //驗證事件被接受後不會再被傳遞給父物件

void mousereleaseevent(qmouseevent *e) //驗證事件事件被忽略後會被傳遞給父物件

void keyreleaseevent(qkeyevent* e)

程式執行結果(見圖2-12)及說明

當在按鈕上按下滑鼠時,呼叫c::mousepressevent()函式,該函式接受該事件,因此事件不再傳遞。因此僅輸出cmousedown。

當釋放滑鼠時呼叫c::mousereleaseevent()函式輸出cmouserelease,該函式呼叫qwidget的預設事件處理函式忽略該事件,因此事件傳遞給mc的父物件ma處理,此時呼叫a::mousereleaseevent()函式輸出amouserelease。

④~⑥的鍵盤事件與滑鼠事件類似,只是⑥表示的是qt的預設處理方式為接受該事件

示例2.21:event()函式與事件處理函式的關係。

class a:public qwidget{public:

bool event(qevent* e){

if(e->type()==qevent::mousebuttonpress) //處理滑鼠事件

{cout<

QT原始碼解析 四)剖析Qt的事件機制原理

qt原始碼解析 一 qt建立視窗程式 訊息迴圈和winmain函式 qt原始碼解析 二 深入剖析qt元物件系統和訊號槽機制 qt原始碼解析 三 深入剖析qt元物件系統和訊號槽機制 續 qt原始碼解析 四 剖析qt的事件機制原理 qt原始碼解析 五 qlibrary跨平台呼叫動態庫的實現 qt原始碼解...

Qt原理分析 七 Qt中的事件過濾器

問題 有時候我們在自定義事件時,並不是需要所有的事件型別都可以觸發的,例如在數字鍵盤中,我們就不希望按下字母可以觸發事件並輸入到編輯框中。那麼qt有什麼機制可以過濾掉一部分事件呢?事件過濾器的典型實現 示例 事件過濾器的使用 class mylineedit public qlineedit myl...

Qt事件 changeEvent(改變事件)

改變事件changeevent qevent e 繼承自qwidget 以下事件的變化會觸發changeevent qevent change,工具欄的按鈕被按下 qevent activationchange,活動狀態變化 qevent enabledchange,可用 不可用改變 qevent ...