Qt 坐标位置转换
文章目录
- Qt 坐标位置转换
- 常见的位置坐标转换
- Qt窗体中常用坐标的区别与获取途径
- 当前光标相对于屏幕的绝对位置
- 当前光标相对于当前窗口的位置
- 鼠标事件发生的位置
- 窗体的位置
- 判断鼠标光标是否悬浮在某个子控件上
从事Qt快一年了 ,在做坐标转换的时候容易搞混 这边重新梳理一下 做一下总结
最主要的几种坐标系统:
- 窗口坐标(Window Coordinates):窗口坐标是相对于窗口左上角的坐标。在这个坐标系统中,原点(0,0)位于窗口的左上角,x 轴从左到右增加,y 轴从上到下增加。这意味着,如果你在窗口中的某个位置点击鼠标,那么你得到的鼠标点击事件的坐标就是相对于窗口左上角的坐标。
- 显示器坐标(Screen Coordinates):显示器坐标是相对于整个显示器的坐标。在这个坐标系统中,原点(0,0)位于显示器的左上角,x 轴从左到右增加,y 轴从上到下增加。这意味着,无论你在哪个窗口或者哪个部分的屏幕上点击鼠标,你得到的鼠标点击事件的坐标都是相对于显示器左上角的坐标。
- 父窗口坐标(Parent Coordinates):这是相对于父窗口(如果有的话)的坐标系统。原点(0,0)位于父窗口的左上角。这在处理嵌套窗口或控件时非常有用。
- 场景坐标(Scene Coordinates):这是在 QGraphicsScene 中使用的坐标系统,用于处理图形项的位置和变换。原点(0,0)可以在场景的任何位置,默认在中心 这取决于你如何设置和使用场景。
- 视图坐标(View Coordinates):这是在 QGraphicsView 中使用的坐标系统,用于处理视图滚动和缩放。原点(0,0)位于视图的左上角。
常见的位置坐标转换
- QPoint QMouseEvent::pos()
这个只是返回鼠标事件相对这个widget(重载了QMouseEvent的widget)的位置。 - QPoint QMouseEvent::globalPos()
窗口坐标,这个是返回鼠标的全局坐标,相对于屏幕的左上角 - QPoint QCursor::pos()
返回相对显示器的全局坐标 - QPoint QWidget::mapToGlobal(const QPoint & pos) const
将窗口坐标转换成显示器坐标 - QPoint QWidget::mapFromGlobal(const QPoint & pos) const
将显示器坐标转换成窗口坐标 - QPoint QWidget::mapToParent(const QPoint & pos) const
将窗口坐标获得的pos转换成父类widget的坐标 - QPoint QWidget::mapFromParent(const QPoint & pos) const
将父类窗口坐标转换成当前窗口坐标 - QPoint QWidget::mapTo(const QWidget * parent, const QPoint & pos) const
将当前窗口坐标转换成指定parent坐标。 - QWidget::pos() : QPoint
这个属性获得的是当前目前控件在父窗口中的位置 - const QPointF & QMouseEvent::screenPos() const和QPoint QMouseEvent::globalPos() 值相同,但是类型更高精度的QPointF
例如 pWidget->mapToGlobal(QPoint(x,y));即 把你在pWidget里面的坐标(x,y) 所表示的点. 用Global的坐标表示 即 pWidget->mapToGlobal(QPoint(0,0)) +QPoint(x,y) = pWidget->mapToGlobal(QPoint(x,y)) 如图:
Qt窗体中常用坐标的区别与获取途径
当前光标相对于屏幕的绝对位置
QCursor::pos()
当前光标相对于当前窗口的位置
this->mapFromGlobal(QCursor::pos())
鼠标事件发生的位置
void MainWindow::mouseReleaseEvent(QMouseEvent* event)
{
QPoint pos = event->pos(); //相对于当前窗口的位置
QPoint globalPos = event->globalPos(); //相对于屏幕的全局绝对位置
}
窗体的位置
QWidget *widget = new QWidget();
widget.pos(); //窗体的左上角的位置
判断鼠标光标是否悬浮在某个子控件上
获取子窗口geometry,判断是否包含光标所在的坐标,如果是,则表示光标正悬浮在该子控件上。
注意:
**geometry()是相对于父窗口的相对位置,而QCursor::pos()获取的是鼠标绝对位置。**需要进行一次转换,要不将父窗口的相对位置进行换算,要不将鼠标的绝对位置进行换算,这里采用将鼠标绝对位置换算到控件上,示例代码如下:
if(ui->pushButtonTest->geometry().contains( this->mapFromGlobal(QCursor::pos())))
{
//do something...
}
参考demo
传入的坐标原则为mapTo接口传入以自身左上角为原点的坐标,mapFrom类型接口传入以global/parent左上角为原点的坐标