Qt事件傳遞相關問題

2021-09-02 01:32:16 字數 623 閱讀 4873

涉及到深層次視窗結構或者視窗封裝時,經常會遇到上層視窗接收不到事件的問題。排除這類問題需要了解視窗間的事件傳遞過程。

應用程式產生事件時,事件會先派發給父視窗,由父視窗在內部派發給子視窗,子視窗會進一步傳遞給子視窗的子視窗,直到遍歷到最後沒有子視窗的視窗物件,進入子視窗的使用者事件處理函式。從子視窗開始,事件會依次進入到父視窗的事件處理函式中,子視窗可以呼叫event->accept()來中斷事件的向上傳遞。總結來說是先下沉再上浮。

當發現父視窗沒有對應的事件觸發使用者函式時,首先要確認相關功能是否啟用,比如滑鼠懸停和拖拽功能。其次需要在子視窗的事件處理函式中,顯式呼叫event->ignore()來使事件繼續向上傳遞。

具有父子關係的視窗,如果想父視窗接收到上述事件,必須將父視窗和所有的子視窗的相關功能全部啟用,否則事件會在中間某個視窗中斷傳遞。

預設view不會將滑鼠移動事件傳遞出來,所以需要顯式的在view中過載mouseevent(),並將事件ignore(),將其傳遞出來,這樣做是為了將事件全部通知所有父子視窗。

懸停事件在圖元重疊時,事件會被上層圖元(無父子關係)攔截,但是一般地圖應用需求可能需要通知所有下層圖元。此問題的解決辦法見另一篇文章:解決qt graphis-view框架中,上層圖元接收hover事件導致底層圖元接收不到的問題

Qt 事件傳遞方向

qt的事件傳遞方向 先傳遞給獲得焦點的部件,只有在此部件忽略掉了該事件,才會傳遞給這個部件的父部件。重新實現事件處理函式的時候,要呼叫父類的相應事件處理函式來實現預設操作。例如在widget上構造乙個自己的lineedit部件,只有當lineedit部件忽略掉了這個事件後,父部件才能捕獲,並且這個部...

QT事件傳遞與事件過濾器

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

js面試,事件相關問題

這一節比較簡單了,也沒啥說的 一 事件繫結 1.1 通用事件繫結 el.addeventlistener event,callback el.preventdefault 阻止通過 addeventlistener 新增的事件的預設事件 1.2 ie事件繫結 el.attachevent el,ca...