最近在Qt的學習中遇到了一個問題,就是重寫了mouseMoveEvent,在其中打印鼠標移動的坐標信息卻無效
在Qt中要捕捉鼠標移動信息需要重寫mouseMoveEvent,但是mouseMoveEvent為了不太消耗資源在默認情況下是需要按下鼠標移動才能捕捉到,想要在鼠標沒有按下的情況下也能捕捉鼠標,需要對窗口設置setMouseTracking(true).
此屬性保存是否為小部件啟用了鼠標跟蹤
如果禁用了鼠標跟蹤(默認設置),則僅在移動鼠標時按下至少一個鼠標按鈕時,窗口小部件才會接收鼠標移動事件。
如果啟用了鼠標跟蹤,則即使未按下任何按鈕,小部件也將接收鼠標移動事件。
在Qwidget中使用是沒有問題的,但是在QMainWindow中即使設置了mouseTracking卻依然無法捕捉到鼠標沒有按下時的移動,只有按下鼠標任意一個按鍵移動時才有效
解決辦法就是將QMainWindow中的centrolWidget也設置mouseTracking,之后就可以捕捉沒有按下鼠標時的移動了
原因:centrolWidget是QMainWindow的子類,你如果在子類上響應鼠標事件,只會觸發子類的mouseMoveEvent,根據C++繼承和重載的原理,所以子類也要setMouseTracking(true); 所以如果你想響應鼠標事件的控件被某個父控件包含,則該控件及其父控件或容器也需要setMouseTracking(true);