我們可能會遇到這樣一種需求——監測某個物件的事件投遞過程,分析或者攔截某個事件,這時我們就要用到事件過濾器了。什麼是事件過濾器呢?事件過濾器本質上是qobject子類的乙個物件,該物件過載了eventfilter介面。
如果使用事件過濾器呢?
1 定義qobject子類a,過載eventfilter介面,在這個介面中實現過濾功能;
2 被觀察者必須是qobject或者qobject子類的物件,呼叫qobject::installeventfilter
()傳入a的物件,即可完成a對該物件的監測;
3 過濾器比事件實際接受者要早一步得到事件。
假設有乙個類cinspecta 用於截獲事件,當截獲事件時輸出字串提示,**呼叫過程如下:
監測者類宣告:
#ifndef cinspect_h
#define cinspect_h
#include class cinspecta : public qobject
;#endif // cinspect_h
實現#include "cinspect.h"
#include cinspecta::cinspecta(qobject *parent) : qobject(parent)
bool cinspecta::eventfilter(qobject *obj, qevent *event)
客戶端呼叫
int main(int argc, char *argv)
預期結果是輸出inspect : "a" , event id = ******,但是執行之後,發現沒有任何輸出。為什麼呢?原因在於「a.event(&e);」這個呼叫說明a已經開始處理事件了,這時事件過濾器不會起作用。這裡涉及到乙個概念:傳送(send)和投遞(delivery)。傳送事件是有物件a傳送到物件b,這是乙個使用者呼叫的過程;投遞是qt框架沿著接收者的繼承關係找到最終處理介面的過程。
為了使過濾器生效,我要們「傳送」事件,而不是「投遞」事件,修改一下main
函式:
int main(int argc, char *argv)
Qt 事件過濾
qt的事件處理有5中級別 1.重寫控制項的事件處理函式 如重寫keypressevent mousepressevent 和paintevent 這是最常用的事件處理方法,我們已經看到過很多這樣的例子了。2.重寫qobject event 在事件到達事件處理函式時處理它。在需要改變tab鍵的慣用法時...
QT 事件過濾器 滾輪事件
this installeventfilter this 註冊監視物件下面是eventfilter函式 bool xx eventfilter qobject obj,qevent e else page resize size return true else else if wheelevent...
Qt 的事件監聽和事件過濾
qt 產品級的開發專案中經常會用到一些自定義控制項,從而達到一些可定製化的效果,這時候往往需要重寫它的監聽事件,滿足產品的需求。這裡用乙個簡單的例子記錄一下思路 新建乙個diylabel 繼承 qlabel 重寫enterevent 和 mousepressevent 例子 diylabel 的實現...