Qt事件传递相关问题
事件傳遞
涉及到深層次窗口結(jié)構(gòu)或者窗口封裝時(shí),經(jīng)常會遇到上層窗口接收不到事件的問題。排除這類問題需要了解窗口間的事件傳遞過程。
應(yīng)用程序產(chǎn)生事件時(shí),事件會先派發(fā)給父窗口,由父窗口在內(nèi)部派發(fā)給子窗口,子窗口會進(jìn)一步傳遞給子窗口的子窗口,直到遍歷到最后沒有子窗口的窗口對象,進(jìn)入子窗口的用戶事件處理函數(shù)。從子窗口開始,事件會依次進(jìn)入到父窗口的事件處理函數(shù)中,子窗口可以調(diào)用event->accept()來中斷事件的向上傳遞。總結(jié)來說是先下沉再上浮。
當(dāng)發(fā)現(xiàn)父窗口沒有對應(yīng)的事件觸發(fā)用戶函數(shù)時(shí),首先要確認(rèn)相關(guān)功能是否啟用,比如鼠標(biāo)懸停和拖拽功能。其次需要在子窗口的事件處理函數(shù)中,顯式調(diào)用event->ignore()來使事件繼續(xù)向上傳遞。
關(guān)于鼠標(biāo)懸停移動和拖拽事件
具有父子關(guān)系的窗口,如果想父窗口接收到上述事件,必須將父窗口和所有的子窗口的相關(guān)功能全部啟用,否則事件會在中間某個(gè)窗口中斷傳遞。
QGraphicsView中的事件
默認(rèn)view不會將鼠標(biāo)移動事件傳遞出來,所以需要顯式的在view中重載mouseEvent(),并將事件ignore(),將其傳遞出來,這樣做是為了將事件全部通知所有父子窗口。
QGraphicsScene中的事件
懸停事件在圖元重疊時(shí),事件會被上層圖元(無父子關(guān)系)攔截,但是一般地圖應(yīng)用需求可能需要通知所有下層圖元。此問題的解決辦法見另一篇文章:解決Qt graphis-view框架中,上層圖元接收hover事件導(dǎo)致底層圖元接收不到的問題
總結(jié)
以上是生活随笔為你收集整理的Qt事件传递相关问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “史诗级”大发现:车祸前1秒特斯拉自驾系
- 下一篇: Qt Quick学习笔记