在Qt的开发中,有时候需要获取鼠标点击的位置的坐标。在Qt中坐标分为相对坐标和绝对坐标;相对坐标是以控件的左上角为(0,0)点的坐标系的坐标,绝对坐标是以显示器屏幕的左上角为(0,0)点的坐标。如图所示:
获取鼠标位置的3个方法
QCursor::pos() 的结果是鼠标相对于桌面的绝对位置
mousePressEvent的参数event的位置,event->pos() 是鼠标相对于应用程序的位置,
mapToGlobal(event->pos()) 和 event->globalPos()都是相对于桌面原点的位置为绝对位置
通过以下代码来验证
void CTestWidgetRadius::mouseMoveEvent(QMouseEvent *event)
{QString t_tip = QString("event->globalPos() = (%1,%2)\n QCursor::pos() = (%3,%4)").arg(event->globalPos().x()).arg(event->globalPos().y()).arg(QCursor::pos().x()).arg(QCursor::pos().y());QToolTip::showText(mapToGlobal(event->pos()), t_tip, this);
}
结果如图所示:
void CTestWidgetRadius::mouseMoveEvent(QMouseEvent *event)
{QString t_tip = QString("event->pos() = (%1,%2)\n QCursor::pos() = (%3,%4)").arg(event->pos().x()).arg(event->pos().y()).arg(QCursor::pos().x()).arg(QCursor::pos().y());QToolTip::showText(mapToGlobal(event->pos()), t_tip, this);}
结果如图所示:
如果是窗口里面的某个子控件,你用鼠标获取它的位置时,它也是基于控件的左上角的坐标系的位置。想要获取它在窗口里面的位置需要转换:
btn->mapTo(this, mouseEvent->pos());//btn是窗口内的QPushButton控件,this是代表的当前窗口,如果是其它父对象,就填父对象指针。
如果想获取控件的绝对位置,需要再转一遍
mapToGlobal(btn->mapTo(this, mouseEvent->pos())) ;//这也就可以获取控件的绝对位置了。