QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)
????????在Qt中要捕捉鼠標移動事件需要重寫MouseMoveEvent,但是MouseMoveEvent為了不太耗資源在默認狀態下是要鼠標按下才能捕捉到。要想鼠標不按下時的移動也能捕捉到,需要setMouseTracking(true)。
bool?mouseTracking
這個屬性保存的是窗口部件跟蹤鼠標是否生效。
如果鼠標跟蹤失效(默認),當鼠標被移動的時候只有在至少一個鼠標按鍵被按下時,這個窗口部件才會接收鼠標移動事件。
如果鼠標跟蹤生效,如果沒有按鍵被按下,這個窗口部件也會接收鼠標移動事件。
????????QWidget中使用是沒有問題的,但是,對于QMainWindow即使使用了setMouseTracking(true)依然無法捕捉到鼠標沒有按下的移動,只有在鼠標按下是才能捕捉。
????????解決辦法:要先把QMainWindow的CentrolWidget使用setMouseTracking(true)開啟移動監視。然后在把QMainWindow的setMouseTracking(true)開啟監視。之后就一切正常了。
原因:CentrolWIdget是QMainWindow的子類,你如果在子類上響應鼠標事件,只會觸發子類的mouseMoveEvent,根據C++繼承和重載的原理,所以子類也要setMouseTracking(true); 所以如果你想響應鼠標事件的控件被某個父控件包含,則該控件及其父控件或容器也需要setMouseTracking(true);
?
ui->centralWidget->setMouseTracking(true);
setMouseTracking(true); //這是激活整個窗體的鼠標追蹤 ui->pBtnMenu->setMouseTracking(true); //進入某個按鈕時,鼠標追蹤屬性失效,因此我們也需要激活該按鈕的鼠標追蹤功能 ui->pBtnTest->setMouseTracking(true);?
//然后再實現mouseMoveEvent()事件
void MainWindow::mouseMoveEvent(QMouseEvent *e) { qDebug()<<"mouse move "; e->accept(); if(enterBtn(e->pos(),ui->pBtnMenu)) //Qlab_context->setText("這是第一個按鈕"); qDebug()<<"menu"; if(enterBtn(e->pos(),ui->pBtnTest)) qDebug()<<"test"; //Qlab_context->setText("這是第二個按鈕"); } //這里我使用另一個函數來完成判斷鼠標是否在一個按鈕區域內,如果在區域內只返回真,否則返回假 bool MainWindow::enterBtn(QPoint pp, QPushButton *btn) { int height = btn->height(); int width = btn->width(); QPoint btnMinPos = btn->pos(); QPoint btnMaxPos = btn->pos(); btnMaxPos.setX(btn->pos().x()+width); btnMaxPos.setY(btn->pos().y()+height); if(pp.x() >= btnMinPos.x() && pp.y() >= btnMinPos.y() && pp.x() <= btnMaxPos.x() && pp.y() <= btnMaxPos.y()) return true; else return false; }?
總結
以上是生活随笔為你收集整理的QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android locknow,java
- 下一篇: stm32系统滴答定时器使用