Qt事件系統之五 事件過濾器和事件的傳送

2021-10-09 00:25:25 字數 1433 閱讀 7612

qt提供了事件過濾器來實現在乙個部件中監控其他多個部件的事件。事件過濾器與其他部件不同,它不是乙個類,只是由兩個函式組成的一種操作,用來完成乙個部件對其他部件的事件的監視。這兩個函式分別是 installeventfilter() 和 eventfilter(),都是qobject類中的函式。下面通過具體的例子來講解。

新建qt gui應用,將專案名稱更改為myeventfilter,基類選擇qwidget,類名保持widget不變。完成後在設計模式中向介面上拖入乙個qtextedit和乙個qspinbox。在widget.**件中新增函式宣告:

//事件過濾器

bool eventfilter(qobject *obj, qevent *event);

在建構函式中新增**:

//為textedit和spinbox在本視窗上安裝事件過濾器

ui->textedit->installeventfilter(this);

ui->spinbox->installeventfilter(this);

要對乙個部件使用事件過濾器,那麼就要先使用installeventfilter() 函式為該部件安裝事件過濾器,這個函式的引數表明了監視物件。比如這裡就是為textedit部件和spinbox部件安裝了事件過濾器,其引數this表明要在本部件即widget中監視textedit和spinbox的事件。這樣,就需要重新實現widget類的eventfilter()函式,在其中截獲並處理兩個子部件的事件。

//事件過濾器

bool widget::eventfilter(qobject *obj, qevent *event)

else //如果是其他事件,可以進行進一步的處理

}else if (obj == ui->spinbox)

else

}else

}else return qwidget::eventfilter(obj, event);}

在這個事件過濾器中先判斷部件的型別,然後再判斷事件的型別,如果是我們需要的事件就將其進行強制型別轉換,然後進行相應的處理。這裡需要說明,如果要對乙個 特定的事件進行處理,而且不希望它在後面的傳遞過程中再被處理,那麼就返回true, 否則返回false。這個函式中實現了在textedit部件中使用滾輪進行內容的放大或縮小,在spinbox部件中使用空格來使數值設定為0。

可以看到,使用事件過濾器可以很容易地處理多個部件的多個事件,如果不使用它,我們就得分別子類化各個部件,然後重新實現它們對應的各個事件處理函式,那樣就會很麻煩了。

這兩個函式還有其他一些區別,比如 sendevent() 中的qevent物件引數在事件傳送完成後無法自動刪除,所以需要在棧上建立qevent物件;而 postevent() 中的qevent物件引數必須在堆上進行建立(例如使用new),當事件被傳送後事件佇列會自動刪除它。

下面在widget.cpp檔案中的建構函式裡新增**來向spinbox部件傳送乙個向上方向鍵被按下的事件:

Qt 事件過濾器

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

Qt 事件過濾器

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

Qt事件過濾器

昨天發了blog之後,提供一種不用子類化的方式來實現左鍵雙擊,就是使用qobject提供的事件過濾器來實現對其他物件的事件進行響應。這裡先安裝對應物件的事件過濾器,installeventfilter this 這樣只要該物件產生事件,就會先執行本物件的eventfilter 函式,在該函式裡先判斷...