QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)
????????在Qt中要捕捉鼠標(biāo)移動(dòng)事件需要重寫MouseMoveEvent,但是MouseMoveEvent為了不太耗資源在默認(rèn)狀態(tài)下是要鼠標(biāo)按下才能捕捉到。要想鼠標(biāo)不按下時(shí)的移動(dòng)也能捕捉到,需要setMouseTracking(true)。
bool?mouseTracking
這個(gè)屬性保存的是窗口部件跟蹤鼠標(biāo)是否生效。
如果鼠標(biāo)跟蹤失效(默認(rèn)),當(dāng)鼠標(biāo)被移動(dòng)的時(shí)候只有在至少一個(gè)鼠標(biāo)按鍵被按下時(shí),這個(gè)窗口部件才會(huì)接收鼠標(biāo)移動(dòng)事件。
如果鼠標(biāo)跟蹤生效,如果沒有按鍵被按下,這個(gè)窗口部件也會(huì)接收鼠標(biāo)移動(dòng)事件。
????????QWidget中使用是沒有問題的,但是,對(duì)于QMainWindow即使使用了setMouseTracking(true)依然無法捕捉到鼠標(biāo)沒有按下的移動(dòng),只有在鼠標(biāo)按下是才能捕捉。
????????解決辦法:要先把QMainWindow的CentrolWidget使用setMouseTracking(true)開啟移動(dòng)監(jiān)視。然后在把QMainWindow的setMouseTracking(true)開啟監(jiān)視。之后就一切正常了。
原因:CentrolWIdget是QMainWindow的子類,你如果在子類上響應(yīng)鼠標(biāo)事件,只會(huì)觸發(fā)子類的mouseMoveEvent,根據(jù)C++繼承和重載的原理,所以子類也要setMouseTracking(true); 所以如果你想響應(yīng)鼠標(biāo)事件的控件被某個(gè)父控件包含,則該控件及其父控件或容器也需要setMouseTracking(true);
?
ui->centralWidget->setMouseTracking(true);
setMouseTracking(true); //這是激活整個(gè)窗體的鼠標(biāo)追蹤 ui->pBtnMenu->setMouseTracking(true); //進(jìn)入某個(gè)按鈕時(shí),鼠標(biāo)追蹤屬性失效,因此我們也需要激活該按鈕的鼠標(biāo)追蹤功能 ui->pBtnTest->setMouseTracking(true);?
//然后再實(shí)現(xiàn)mouseMoveEvent()事件
void MainWindow::mouseMoveEvent(QMouseEvent *e) { qDebug()<<"mouse move "; e->accept(); if(enterBtn(e->pos(),ui->pBtnMenu)) //Qlab_context->setText("這是第一個(gè)按鈕"); qDebug()<<"menu"; if(enterBtn(e->pos(),ui->pBtnTest)) qDebug()<<"test"; //Qlab_context->setText("這是第二個(gè)按鈕"); } //這里我使用另一個(gè)函數(shù)來完成判斷鼠標(biāo)是否在一個(gè)按鈕區(qū)域內(nèi),如果在區(qū)域內(nèi)只返回真,否則返回假 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; }?
總結(jié)
以上是生活随笔為你收集整理的QT mouseMoveEvent事件(qmainwindow内追踪鼠标事件事件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android locknow,java
- 下一篇: java ssm项目_JAVA项目:逝去