事件過濾器

2021-06-22 06:36:52 字數 1345 閱讀 3395

2009-11-22 12:21:40

標籤:c++

學習教程

qt教程qt

原始出處 、作者資訊和本宣告。否則將追究法律責任。

qt建立了qevent事件物件之後,會呼叫qobject的event()函式做事件的分發。有時候,你可能需要在呼叫event()函式之前做一些另外的操作,比如,對話方塊上某些元件可能並不需要響應回車按下的事件,此時,你就需要重新定義元件的event()函式。如果元件很多,就需要重寫很多次event()函式,這顯然沒有效率。為此,你可以使用乙個事件過濾器,來判斷是否需要呼叫event()函式。

qojbect有乙個eventfilter()函式,用於建立事件過濾器。這個函式的簽名如下:

bool qobject::eventfilter ( qobject * watched, qevent *

event )

如果watched物件安裝了事件過濾器,這個函式會被呼叫並進行事件過濾,然後才輪到元件進行事件處理。在重寫這個函式時,如果你需要過濾掉某個事件,例如停止對這個事件的響應,需要返回true。

event)

else

else

上面的例子中為mainwindow建立了乙個事件過濾器。為了過濾某個元件上的事件,首先需要判斷這個物件是哪個元件,然後判斷這個事件的型別。例如,我不想讓textedit元件處理鍵盤事件,於是就首先找到這個元件,如果這個事件是鍵盤事件,則直接返回true,也就是過濾掉了這個事件,其他事件還是要繼續處理,所以返回false。對於其他元件,我們並不保證是不是還有過濾器,於是最保險的辦法是呼叫父類的函式。

在建立了過濾器之後,下面要做的是安裝這個過濾器。安裝過濾器需要呼叫installeventfilter()函式。這個函式的簽名如下:

這個函式是qobject的乙個函式,因此可以安裝到任何qobject的子類,並不僅僅是ui元件。這個函式接收乙個qobject物件,呼叫了這個函式安裝事件過濾器的元件會呼叫filterobj定義的eventfilter()函式。例如,textfield.installeventfilter(obj),則如果有事件傳送到textfield元件是,會先呼叫obj->eventfilter()函式,然後才會呼叫textfield.event()。

如果乙個元件安裝了多個過濾器,則最後乙個安裝的會最先呼叫,類似於堆疊的行為。

注意,如果你在事件過濾器中delete了某個接收元件,務必將返回值設為true。否則,qt還是會將事件分發給這個接收元件,從而導致程式崩潰。

事件過濾器和被安裝的元件必須在同一執行緒,否則,過濾器不起作用。另外,如果在install之後,這兩個元件到了不同的執行緒,那麼,只有等到二者重新回到同一執行緒的時候過濾器才會有效。

本文出自 「豆子空間」 部落格,請務必保留此出處

事件過濾器

正常情況下,被qwidget看成是去移動 鍵盤焦點,但少數視窗部件需要自行解釋。讓我們試著設想已經有了乙個customerinfodialog的小部件。customerinfodialog 包含一系列qlineedit.現在,我們想用空格鍵來代替tab,使焦點在這些qlineedit間切換。乙個解決...

事件過濾器

6.1哪個控制項需求過濾事件 就給哪個控制項安裝過濾器 6.2步驟1 安裝過濾器 ui label t installeventfilter this 6.4 步驟2 6.4.1 重寫事件 給ui label做事件過濾器攔截 步驟1 給控制項安裝過濾器 通過父視窗給label安裝過濾器 ui lab...

Qt 事件過濾器

qt 事件模型乙個真正強大的特色是乙個qobject的例項能夠管理另乙個qobject 例項的事件。乙個事件過濾器的安裝需要下面2個步驟 1 呼叫installeventfilter 註冊需要管理的物件。2 在eventfilter 裡處理需要管理的物件的事件。偽 如下 pfilterlineedi...