引用第1楼qulu2009于2009-12-14 13:03发表的 :
我的情况差不多,即使setMouseTracking(true);后也无法在不按鼠标左键右键的时候实时响应mousemoveEvent 事件,感觉是个bug,不知道有没有解决的方案
经过测试:
mouseEvent->pos()得到的是相对于 widget的坐标,
如果把代码写成这样:
void MoveButton::mouseMoveEvent(QMouseEvent *event)
{
QRect rect = ui.buttonNo->geometry();
QPoint point = event->globalPos();
ui.lineEdit->setText(QString(QString::number(point.x())+","+QString::number(point.y())));
ui.ButtonNoPosEdit->setText(QString(QString::number(rect.x())+","+QString::number(rect.y())));
if (rect.contains(point))
{
ui.buttonNo->move(qrand()%width(),qrand()%height());
}
}
那么不需要按鼠标左右键也能得到实时响应。 但是是相对于全局系统坐标的。
但是一旦改成mouseEvent->pos() 坐标是和按钮坐标一致时并按着鼠标左右键才会发成响应。
经过观察:
通过 ui.buttonNo->geometry(); 得到的rect 比 实际 button 的有效区域大出一个像素的坐标值。
所以 代码 给成这样
QRect rect = ui.buttonNo->frameGeometry();
QPoint point = event->pos();
QSize size = rect.size()-QSize(-2,-2);
QRect dstRect = QRect(QPoint(rect.x()-1,rect.y()-1),size);
ui.lineEdit->setText(QString(QString::number(point.x())+","+QString::number(point.y())));
ui.ButtonNoPosEdit->setText(QString(QString::number(dstRect.x())+","+QString::number(dstRect.y())));
if (dstRect.contains(point))
{
ui.buttonNo->move(qrand()%width(),qrand()%height());
}
就能正确运行了。。