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

最近用Qt軟件界面,須要用到mouseMoveEvent,研究了下,發現些問題,分享一下。
在Qt中要捕捉鼠標移動事件須要重寫MouseMoveEvent,可是MouseMoveEvent爲了避免太耗資源在默認狀態下是要鼠標按下才能捕捉到。要想鼠標不按下時的移動也能捕捉到,須要setMouseTracking(true)。函數


bool mouseTracking
這個屬性保存的是窗口部件跟蹤鼠標是否生效。ui

若是鼠標跟蹤失效(默認),當鼠標被移動的時候只有在至少一個鼠標按鍵被按下時,這個窗口部件纔會接收鼠標移動事件。
若是鼠標跟蹤生效,若是沒有按鍵被按下,這個窗口部件也會接收鼠標移動事件。
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()事件get

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;
}
test

相關文章
相關標籤/搜索