事件過濾器

2021-08-08 21:03:42 字數 1274 閱讀 2741

正常情況下,被qwidget看成是去移動 鍵盤焦點,但少數視窗部件需要自行解釋。 

讓我們試著設想已經有了乙個customerinfodialog的小部件。customerinfodialog 包含一系列qlineedit. 現在,我們想用空格鍵來代替tab,使焦點在這些qlineedit間切換。 

乙個解決的方法是子類化qlineedit,重新實現keypressevent(),並在keypressevent()裡呼叫focusnextchild()。像下面這樣:

void mylineedit::keypressevent(qkeyevent *event) 

else

}

缺點:如果customerinfodialog裡有很多不同的控制項(比如qcombobox,qedit,qspinbox),我們就必須子類化這麼多控制項。這是乙個煩瑣的任務。 

乙個更好的解決辦法是: 讓customerinfodialog去管理他的子部件的按鍵事件,實現要求的行為。我們可以使用事件過濾器。

1, 呼叫installeventfilter()註冊需要管理的物件。 

2,在eventfilter() 裡處理需要管理的物件的事件。

一般,推薦在customerinfodialog的建構函式中註冊被管理的物件。像下面這樣:

customerinfodialog::customerinfodialog(qwidget *parent)

: qdialog(parent)

一旦,事件管理器被註冊,傳送到firstnameedit,lastnameedit,cityedit,phonenumberedit的事件將首先傳送到eventfilter()。

下面要做的是安裝這個過濾器。安裝過濾器需要呼叫installeventfilter()函式。這個函式的簽名如下:

void qobject::installeventfilter ( qobject * filterobj )

下面是乙個 eventfilter()函式的實現:

bool customerinfodialog::eventfilter(qobject *target, qevent *event) 

} }

return qdialog::eventfilter(target, event);

}

事件過濾器

2009 11 22 12 21 40 標籤 c 學習教程 qt教程qt 原始出處 作者資訊和本宣告。否則將追究法律責任。qt建立了qevent事件物件之後,會呼叫qobject的event 函式做事件的分發。有時候,你可能需要在呼叫event 函式之前做一些另外的操作,比如,對話方塊上某些元件可能...

事件過濾器

6.1哪個控制項需求過濾事件 就給哪個控制項安裝過濾器 6.2步驟1 安裝過濾器 ui label t installeventfilter this 6.4 步驟2 6.4.1 重寫事件 給ui label做事件過濾器攔截 步驟1 給控制項安裝過濾器 通過父視窗給label安裝過濾器 ui lab...

Qt 事件過濾器

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