Qt 事件過濾的5種級別

2021-08-17 05:00:12 字數 2175 閱讀 6714

以下按照事件過濾等級由強到弱分為5級:

1級、繼承類,

並過載notify()函式.

qt 是用

函式來分發事件的.想要在任何事件過濾器檢視任何事件之前先得到這些事件,過載這個函式是唯一的辦法. 通常來說事件過濾器更好用一些, 因為不需要去繼承類. 

而且可以給

物件安裝任意個數的事。

2級、給

物件安裝事件過濾器

.一旦我們給

每個程式中唯一的物件)

裝上過濾器,那麼所有的事件在發往任何其他的過濾器時,都要先經過當前這個

eventfilter(). 

在debug

的時候,這個辦法就非常有用, 也常常被用來處理失效了的

widget

的滑鼠事件,通常這些事件會被

丟掉. ( 在中

, 是先呼叫

的過濾器, 再對事件進行分析, 以決定是否合併或丟棄

)3級、在

qt物件上安裝事件過濾器

.安裝事件過濾器有兩個步驟

: (假設要用

a來監視過濾

b的事件

)首先呼叫b的

installeventfilter( const qoject *obj ), 以a

的指標作為引數. 這樣所有發往

b的事件都將先由a的

eventfilter()處理.

然後, a

要過載qobject::eventfilter()

函式, 在

eventfilter() 

中書寫對事件進行處理的**

.用這種方法改寫上面的例子

: (假設我們將

codeeditor 

放在mainwidget中)

mainwidget::mainwidget()

bool mainwidget::eventfilter( qoject * target , qevent * event )}}

return false;

}

4級、過載

event()函式.

通過過載

event()

函式,我們可以在事件被特定的事件處理函式處理之前(象

keypressevent())

處理它. 比如, 當我們想改變

tab鍵的預設動作時,一般要過載這個函式. 在處理一些不常見的事件(比如

:layoutdirectionchange)

時,evnet()

也很有用,因為這些函式沒有相應的特定事件處理函式. 當我們過載

event()

函式時, 需要呼叫父類的

event()

函式來處理我們不需要處理或是不清楚如何處理的事件

.下面這個例子演示了如何過載

event()

函式, 改變

tab鍵的預設動作

: (預設的是鍵盤焦點移動到下乙個控制項上

. )

bool codeeditor::event(qevent * event)

}return qwidget::event(event);

}

5級、過載特定事件處理函式

.最常見的事件處理辦法就是過載象

mousepressevent(), keypressevent(), paintevent() 

這樣的特定事件處理函式. 以按鍵事件為例, 乙個典型的處理函式如下

:

void imageview::keypressevent(qkeyevent * event)

}

從assistant上獲取的qt event表述:

1.qt的event通過qobject通知另乙個qobject,event用乙個qevent類表示,它是所有event事件的基類,特殊event如滑鼠event用qevent的子類

如qmouseevent類表示。

2.qwidget過載了event()函式,並在這裡把所有的event**給相應的event處理函式,如mousepressevent(),mousereleaseevent().

3.qt還可以設定乙個qobject去監視另乙個qobject的event,這個功能通過eventfilter()實現的(installeventfilter()函式)。

Qt 事件過濾

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

Qt5 事件過濾器

事件過濾器 qt中乙個獨特的事件處理機制,可以讓乙個物件偵聽攔截 另外乙個物件的事件 1 呼叫installeventfilter 註冊需要管理的物件 2 在eventfilter 裡處理需要管理的物件的事件。例如 用 obja 過濾 objb 的事件,即事件到達 objb 之前,先交由 obja ...

Qt 的事件監聽和事件過濾

qt 產品級的開發專案中經常會用到一些自定義控制項,從而達到一些可定製化的效果,這時候往往需要重寫它的監聽事件,滿足產品的需求。這裡用乙個簡單的例子記錄一下思路 新建乙個diylabel 繼承 qlabel 重寫enterevent 和 mousepressevent 例子 diylabel 的實現...