Qt的事件傳遞過程和事件過濾器的示例

2021-10-07 03:55:56 字數 3918 閱讀 1534

#ifndef mylineedit_h

#define mylineedit_h

#include

class

mylineedit

:public qlineedit

;#endif

// mylineedit_h

mylineedit.cpp**為:

#include

"mylineedit.h"

#include

#include

mylineedit::

mylineedit

(qwidget *parent)

:qlineedit

(parent)

void mylineedit::

keypressevent

(qkeyevent *event)

widget.h**為:

#ifndef widget_h

#define widget_h

#include

class

mylineedit

;class

widget

:public qwidget

;#endif

// widget_h

widget.cpp**為:

#include

"widget.h"

#include

"mylineedit.h"

#include

widget::

widget

(qwidget *parent)

:qwidget

(parent)

widget::

~widget()

void widget::

keypressevent

(qkeyevent *event)

mylineedi鍵盤按下事件
改造一下:

void mylineedit::

keypressevent

(qkeyevent *event)

在mylineedit中新增了event->ignore();

再執行:

這時候看到mylineedit的父視窗也響應了這個按鍵事件。

事件的傳遞

舉例二widget.h**:

#ifndef widget_h

#define widget_h

#include

class

mylineedit

;class

widget

:public qwidget

;#endif

// widget_h

widget.cpp**:

#include

"widget.h"

#include

"mylineedit.h"

#include

#include

widget::

widget

(qwidget *parent)

:qwidget

(parent)

widget::

~widget()

bool widget::

event

(qevent *event)

return qwidget::

event

(event);}

bool widget::

eventfilter

(qobject *obj, qevent *event)

}return qwidget::

eventfilter

(obj, event);}

void widget::

keypressevent

(qkeyevent *event)

mylineedit.h**:

#ifndef mylineedit_h

#define mylineedit_h

#include

class

mylineedit

:public qlineedit

;#endif

// mylineedit_h

mylineedit.cpp**:

#include

"mylineedit.h"

#include

#include

mylineedit::

mylineedit

(qwidget *parent)

:qlineedit

(parent)

bool mylineedit::

event

(qevent *event)

return qlineedit::

event

(event);}

void mylineedit::

keypressevent

(qkeyevent *event)

鍵盤上輸入乙個數字,或者字母

用圖來表示事件的傳播順序:

對於事件過濾器的使用方法:

先在父視窗中註冊需要安裝接收某訊息的控制項安裝事件過濾器:

m_lineedit-

>

installeventfilter

(this

);

然後重寫父視窗的

bool widget::

eventfilter

(qobject *obj, qevent *event)

}return qwidget::

eventfilter

(obj, event)

;}

return true表示事件已經得到了處理,不必繼續傳播。(大家可以將return true;的注釋去掉看看,會看到只會輸出 「widget的事件過濾器」 後訊息就不再被傳播了。)

return false表示事件需要繼續傳遞。

return qwidget::

eventfilter

(obj, event)

;

這樣寫,是呼叫父類的eventfilter,也就是繼續傳播事件。

當過濾器的 eventfilter() 實現被呼叫的時候, 它就可以選擇是處理該事件,還是**該事件, 或禁止該事件繼續被其它物件處理. 若所有的事件過濾器都允許乙個事件可被繼續處理( 每個過濾器處理後都返回 false ), 該事件最終將被傳送到目標物件. 如果其中乙個中止了這個流程(通過返回 true)。

提取碼:om1l

參考:qt學習之路27–事件傳遞過程和事件過濾器

qt學習之路26–事件處理、事件重寫、關閉文字編輯器操作

詳解 qt event 以及 event filter 事件處理

QT事件傳遞與事件過濾器

qt事件的型別很多,常見的qt的事件如下 鍵盤事件 按鍵按下和鬆開.滑鼠事件 滑鼠移動,滑鼠按鍵的按下和鬆開.拖放事件 用滑鼠進行拖放.滾輪事件 滑鼠滾輪滾動.繪屏事件 重繪螢幕的某些部分.定時事件 定時器到時.焦點事件 鍵盤焦點移動.進入和離開事件 滑鼠移入widget之內,或是移出.移動事件 w...

Qt 事件過濾器

qt 事件模型乙個真正強大的特色是乙個qobject的例項能夠管理另乙個qobject 例項的事件。乙個事件過濾器的安裝需要下面2個步驟 1 呼叫installeventfilter 註冊需要管理的物件。2 在eventfilter 裡處理需要管理的物件的事件。偽 如下 pfilterlineedi...

Qt 事件過濾器

目標部件有事件產生後,首先會傳遞給監視物件 事件過濾器 進行處理而不是該事件對應的事件處理器。所以說我們可以截獲事件進行處理。監視物件截獲目標物件的事件後就會呼叫自己的eventfilter 函式處理這些事件。bool qobject eventfilter qobject object,qeven...