Qt學習之路 20 事件接收與忽略

2021-08-25 07:49:42 字數 1242 閱讀 2225

原始出處 、作者資訊和本宣告。否則將追究法律責任。

本章內容也是關於qt事件。或許這一章不能有乙個完整的例子,因為對於事件總是感覺很抽象,還是從底層上理解一下比較好的吧!

前面說到了事件的作用,下面來看看我們如何來接收事件。回憶一下前面的**,我們在子類中重寫了事件函式,以便讓這些子類按照我們的需要完成某些功能,就像下面的**:

event )

else

上面的**和前面類似,在滑鼠按下的事件中檢測,如果按下的是左鍵,做我們的處理工作,如果不是左鍵,則呼叫父類的函式。這在某種程度上說,是把事件向上傳遞給父類去響應,也就是說,我們在子類中「忽略」了這個事件。

我們可以把qt的事件傳遞看成鏈狀:如果子類沒有處理這個事件,就會繼續向其他類傳遞。其實,qt的事件物件都有乙個accept()函式和 ignore()函式。正如它們的名字,前者用來告訴qt,事件處理函式「接收」了這個事件,不要再傳遞;後者則告訴qt,事件處理函式「忽略」了這個事 件,需要繼續傳遞,尋找另外的接受者。在事件處理函式中,可以使用isaccepted()來查詢這個事件是不是已經被接收了。

事實上,我們很少使用accept()和ignore()函式,而是想上面的示例一樣,如果希望忽略事件,只要呼叫父類的響應函式即可。記得我們曾經說 過,qt中的事件大部分是protected的,因此,重寫的函式必定存在著其父類中的響應函式,這個方法是可行的。為什麼要這麼做呢?因為我們無法確認 父類中的這個處理函式沒有操作,如果我們在子類中直接忽略事件,qt不會再去尋找其他的接受者,那麼父類的操作也就不能進行,這可能會有潛在的危險。另外 我們檢視一下qwidget的mousepressevent()函式的實現:

event )

if (!rect().contains(

event ->pos()))

}請注意第一條語句,如果所有子類都沒有覆蓋mousepressevent函式,這個事件會在這裡被忽略掉,這暗示著這個元件不關心這個事件,這個事件就可能被傳遞給其父元件。

不過,事情也不是絕對的。在乙個情形下,我們必須使用accept()和ignore()函式,那就是在視窗關閉的時候。如果你在視窗關閉時需要有個詢問對話方塊,那麼就需要這麼去寫:

void mainwindow::closeevent(qcloseevent *

event )

else

}bool mainwindow::continuetoclose()

else

這樣,我們經過詢問之後才能正常退出程式。

本文出自 「豆子空間 」 部落格,請務必保留此出處

Qt事件的接收和忽略

qt的事件是依次分發的,一般由系統自動處理。如果我們需要手動處理事件,需要重寫相關的事件函式。在重寫函式中,處理完我們所需的操作之後,有兩種選擇,一種是讓事件繼續傳遞,即忽略該事件,另一種是 不讓該事件繼續傳遞即接收該事件。下面是簡單的示例 void mypushbutton mousepresse...

Qt 事件的接收和忽略

我們可以把qt的事件傳遞看成鏈狀 如果子類沒有處理這個事件,就會繼續向其父類傳遞 1.新建乙個mybutton類,將其基類改為qpushbutton.2.在ui中新建乙個push button控制項,並將其提公升為mybutton.3.在mybutton.h中增加滑鼠按下事件.ifndef mybu...

19黑馬QT筆記之事件的接收和忽略

1 概念 1 事件的接收 事件被接收後,不會往後傳遞,導致也不會觸發該事件的相應訊號。例如滑鼠按下事件,當使用者按下滑鼠觸發事件,產生乙個事件物件。你重寫了該按鈕的mousepressevent事件處理函式,接收了該物件並人為的不再往下傳遞,事件物件沒了就不會再觸發按鈕的訊號,也就不會觸發該訊號的槽...