Q學習 11 Qt事件系統 過濾事件

2021-07-13 17:08:07 字數 1067 閱讀 3461

我們可能會遇到這樣一種需求——監測某個物件的事件投遞過程,分析或者攔截某個事件,這時我們就要用到事件過濾器了。什麼是事件過濾器呢?事件過濾器本質上是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 的實現...