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 學習之路 2(22):事件總結,qt事件處理的5個層次:這句話的意思是,事件過濾器和安裝過濾器的元件必須在同一執行緒。qt 裡面,物件建立之後,可以使用 movetothread() 函式將乙個物件移動到另外的執行緒。在這種情形下(當然,事件過濾器必須在同一執行緒時才能被正確安裝,這是第一句話說明的),在它們分屬在不同執行緒時,事件過濾器也是不起作用的,只用當它們重新回到同一執行緒(使用 movetothread() 或者是執行緒自然結束)時,過濾器才能重新工作。
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間切換。乙個解決...