Learning Qt 5 8 事件過濾器

2021-09-08 00:11:54 字數 2409 閱讀 2585

qt 學習之路 2(21):事件過濾器

qobject有乙個eventfilter()函式,用於建立事件過濾器:

virtual bool qobject::eventfilter ( qobject * watched, qevent * event );
這個函式返回乙個 bool 型別,如果你想將引數 event 過濾出來,比如,不想讓它繼續**,就返回 true,否則返回 false。事件過濾器的呼叫時間是目標物件(也就是引數裡面的watched物件)接收到事件物件之前。也就是說,如果你在事件過濾器中停止了某個事件,那麼,watched物件以及以後所有的事件過濾器根本不會知道這麼乙個事件。

來看**:

class mainwindow : public qmainwindow ;

mainwindow:

:mainwindow()

bool mainwindow:

:eventfilter

(qobject *obj, qevent *event)

else

}else

}

我們可以向乙個物件上面安裝多個事件處理器,只要呼叫多次installeventfilter()函式。如果乙個物件存在多個事件過濾器,那麼,最後乙個安裝的會第乙個執行,也就是後進先執行的順序。

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

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

這句話的意思是,事件過濾器和安裝過濾器的元件必須在同一執行緒。qt 裡面,物件建立之後,可以使用 movetothread() 函式將乙個物件移動到另外的執行緒。在這種情形下(當然,事件過濾器必須在同一執行緒時才能被正確安裝,這是第一句話說明的),在它們分屬在不同執行緒時,事件過濾器也是不起作用的,只用當它們重新回到同一執行緒(使用 movetothread() 或者是執行緒自然結束)時,過濾器才能重新工作。

總結qt 學習之路 2(22):事件總結,qt事件處理的5個層次:

qt 學習之路 2(23):自定義事件(待看)

q&a:

1.類開頭忘記加q_object?

2.結尾為什麼不用 return false;而是使用return qmainwindow::eventfilter(obj,event);啊?

由於我們是覆蓋了父類的實現,我們只關心 obj == textedit 這個情況,對於其餘情況,依然按照預設實現,也就是要呼叫父類的實現了。

3.對這句不是很明白:qkeyevent *keyevent = static_cast(event)

這是強制型別轉換,類似於 qkeyevent *keyevent = (qkeyevent *)event。

4.安裝eventfilter到mainwindow物件為什麼要用textedit來呼叫?而不是this->installeventfilter(this)?

原來是要monitoredobj->installeventfilter(filterobj);查了幫助。

是的。

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

這個沒明白啊, 是delete了 filterobject* 還是 delete了qtextedit*?

應該是 delete textedit 這種。如果你 delete 了 textedit 卻還是返回 false,其它的事件並不知道這個元件已經被銷毀,所以可能會出現程式錯誤。

7.豆哥,我在你寫「return qwidget::event(e);」的地方

替換為: return (this->patent())->event(e);

編譯不會出錯,但是執行的話會報錯:the program has unexpectedly finished。

這兩種寫法是不一樣的:qwidget::event(e) 是呼叫父類的同名實現;(this->patent())->event(e) 是呼叫該物件的父物件的實現。qt 裡面的 parent 並不是物件導向意義上的父類,而是 qt 實現的物件樹的父節點。二者是不同的。

Qt 事件過濾

qt的事件處理有5中級別 1.重寫控制項的事件處理函式 如重寫keypressevent mousepressevent 和paintevent 這是最常用的事件處理方法,我們已經看到過很多這樣的例子了。2.重寫qobject event 在事件到達事件處理函式時處理它。在需要改變tab鍵的慣用法時...

事件過濾器

2009 11 22 12 21 40 標籤 c 學習教程 qt教程qt 原始出處 作者資訊和本宣告。否則將追究法律責任。qt建立了qevent事件物件之後,會呼叫qobject的event 函式做事件的分發。有時候,你可能需要在呼叫event 函式之前做一些另外的操作,比如,對話方塊上某些元件可能...

事件過濾器

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