以下按照事件過濾等級由強到弱分為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 的實現...