20黑馬QT筆記之event函式

2021-10-05 12:11:40 字數 2217 閱讀 2206

1 event()函式:

1.1 重寫event()函式提前處理事件:

事件物件建立完畢後,qt 將這個事件物件傳遞給qobject的event()函式。event()函式並不直接處理事件,而是將這些事件物件按照它們不同的型別,分發給不同的事件處理器(event handler)。

如上所述,event()函式主要用於事件的分發。所以,如果你希望在事件分發之前做一些操作,就可以重寫這個event()函式了。

例如,我們希望在乙個qwidget元件中監聽 tab 鍵的按下,那麼就可以繼承qwidget,並重寫它的event()函式,來達到這個目的:

//重寫event函式

bool mywidget::

event

(qevent *e)

}//重新分配給event的預設處理方式 //必要的,重新處理其他事件

return qwidget::

event

(e);

//若返回的不是再呼叫qwidget的event函式 而是直接返回false 則表示只能處理tab鍵 其它鍵都不能接收了

//return false;

}

注意:

1)如果返回值是 true,那麼 qt 會認為這個事件已經處理完畢,不會再將這個事件傳送給其它物件,而是會繼續處理事件佇列中的下一事件。

2)如果返回值是false,則代表該控制項只能處理該事件即tab按下,其他事件都不能處理,例如上面的**返回false時,該視窗只能處理鍵盤事件的tab鍵按下,其他按鍵就沒反應,當要輸入文字時,視窗卻沒有返回。所以想要繼續執行控制項預設的處理方式,則需要返回qwidget::event(e)。

3)在event()函式中,呼叫事件物件的accept()和ignore()函式是沒有作用的,不會影響到事件的傳播。

思考:為什麼重寫event後,物件就能傳遞給重寫的類的event函式處理呢?

答:當你設定對某個控制項的event重寫時,例如上面的主視窗,應用程式建立物件後它應該也記錄了該控制項的首位址,然後某個函式其中有乙個qobject*型別的指標,用首位址給它賦值,這樣就能呼叫自定義的event函式。換句話說,若自定義類是繼承於qobject的,若自定義類中重寫了event函式,則優先呼叫該函式,也就是多型的原理。不必太深究內部原理,你會用就行。

2.2原始碼分析:

通過檢視qobject::event()的實現,我們可以理解,event()函式同前面的章節中我們所說的事件處理器有什麼聯絡:

//!!! qt5

bool qobject::

event

(qevent *e)

return

false;}

return

true

;}

這是 qt 5 中qobject::event()函式的源**(qt 4 的版本也是類似的)。我們可以看到,同前面我們所說的一樣,qt 也是使用qevent::type()判斷事件型別,然後呼叫了特定的事件處理器。比如,如果event->type()返回值是qevent::timer,則呼叫timerevent()函式。可以想象,qwidget::event()中一定會有如下的**:

switch (event->type())

事實也的確如此。timerevent()和mousemoveevent()這樣的函式,就是我們前面章節所說的事件處理器 event handler。也就是說,event()函式中實際是通過事件處理器來響應乙個具體的事件。這相當於event()函式將具體事件的處理「委託」給具體的事件處理器。而這些事件處理器是 protected virtual 的,因此,我們也可以重寫了某乙個事件處理器,讓 qt 呼叫我們自己實現的版本。

由此可以見,event()函式可以重寫,每個事件處理函式也可以重寫。event()是乙個集中處理不同型別的事件的地方。如果你不想重寫一大堆事件處理器,就可以重寫這個event()函式,通過qevent::type()判斷不同的事件。

鑑於重寫event()函式需要十分小心注意父類的同名函式的呼叫,一不留神就可能出現問題,所以一般還是建議只重寫事件處理器(當然,也必須記得是不是應該呼叫父類的同名處理器)。這其實暗示了event()函式的另外乙個作用:遮蔽掉某些不需要的事件處理器。正如我們前面的例子看到的那樣,我們建立了乙個只能響應 tab 鍵的元件(返回值為false時)。這種作用是重寫事件處理器所不能實現的。

33黑馬QT筆記之不規則視窗

1 建立不規則視窗的步驟 1 重寫繪圖事件,在繪圖事件中顯示一張。2 但是顯示後仍帶有視窗的邊框,所以我們需要在視窗的建構函式中去掉邊框,並使其類似一樣,使視窗也透明顯示。3 由於邊框沒了,即右上角的按鈕無了,滑鼠無法操作,所以需要重寫滑鼠事件,包括滑鼠按下和移動事件。4 滑鼠按下時 若為右鍵,我們...

52黑馬QT筆記之Qt下建立新執行緒之Qt4版本

前提 這個版本是qt4.7之前建立新執行緒的方法。1 建立新執行緒步驟 1 自定義乙個類,必須繼承於qthread,且執行緒函式必須為run。2 啟動執行緒必須是thread.start 間接啟動 不能直接呼叫run方法啟動執行緒。thread為自定義類的物件,一般放在主線程作為其成員變數。ifnd...

2020 8 4黑馬Qt學習筆記

一。手動重繪視窗 update 二。qbitmap和qpixmap的區別 繼承關係 qbitmap繼承於qpixmap ps 此處學了以下如何新增資源檔案和如何將資源檔案應用於視窗繪圖 1.如何新增資源檔案 2.如何將資源檔案應用於視窗繪圖 注釋部分為另一種實現視窗繪製的方法 三。qpixmap繪圖...