最近用Qt軟件界面,須要用到mouseMoveEvent,研究了下,發現些問題,分享一下。 .net
在Qt中要捕捉鼠標移動事件須要重寫MouseMoveEvent,可是MouseMoveEvent爲了避免太耗資源在默認狀態下是要鼠標按下才能捕捉到。要想鼠標不按下時的移動也能捕捉到,須要setMouseTracking(true)。 blog
這個屬性保存的是窗口部件跟蹤鼠標是否生效。 繼承
若是鼠標跟蹤失效(默認),當鼠標被移動的時候只有在至少一個鼠標按鍵被按下時,這個窗口部件纔會接收鼠標移動事件。 事件
若是鼠標跟蹤生效,若是沒有按鍵被按下,這個窗口部件也會接收鼠標移動事件。 資源
QWidget中使用是沒有問題的,可是,對於QMainWindow即便使用了setMouseTracking(true)依然沒法捕捉到鼠標沒有按下的移動,只有在鼠標按下是才能捕捉。 get
解決辦法:要先把QMainWindow的CentrolWidget使用setMouseTracking(true)開啓移動監視。而後再把QMainWindow的setMouseTracking(true)開啓監視。以後就一切正常了。 it
緣由:CentrolWidget是QMainWindow的子類,你若是在子類上響應鼠標事件,只會觸發子類的mouseMoveEvent,根據C++繼承和重載的原理,因此子類也要setMouseTracking(true); 因此若是你想響應鼠標事件的控件被某個父控件包含,則該控件及其父控件或容器也須要setMouseTracking(true); 容器