MouseMoveEvent為了不太耗資源在默認狀態下是要鼠標按下才能捕捉到。要想鼠標不按下時的移動也能捕捉到,需要setMouseTracking(true)


最近用Qt軟件界面,需要用到mouseMoveEvent,研究了下,發現些問題,分享一下。
在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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM