0
点赞
收藏
分享

微信扫一扫

Qt 坐标位置转换

一脸伟人痣 03-24 10:30 阅读 2

Qt 坐标位置转换

文章目录

最主要的几种坐标系统:

  1. 窗口坐标(Window Coordinates):窗口坐标是相对于窗口左上角的坐标。在这个坐标系统中,原点(0,0)位于窗口的左上角,x 轴从左到右增加,y 轴从上到下增加。这意味着,如果你在窗口中的某个位置点击鼠标,那么你得到的鼠标点击事件的坐标就是相对于窗口左上角的坐标。
  2. 显示器坐标(Screen Coordinates):显示器坐标是相对于整个显示器的坐标。在这个坐标系统中,原点(0,0)位于显示器的左上角,x 轴从左到右增加,y 轴从上到下增加。这意味着,无论你在哪个窗口或者哪个部分的屏幕上点击鼠标,你得到的鼠标点击事件的坐标都是相对于显示器左上角的坐标。
  3. 父窗口坐标(Parent Coordinates):这是相对于父窗口(如果有的话)的坐标系统。原点(0,0)位于父窗口的左上角。这在处理嵌套窗口或控件时非常有用。
  4. 场景坐标(Scene Coordinates):这是在 QGraphicsScene 中使用的坐标系统,用于处理图形项的位置和变换。原点(0,0)可以在场景的任何位置,默认在中心 这取决于你如何设置和使用场景。
  5. 视图坐标(View Coordinates):这是在 QGraphicsView 中使用的坐标系统,用于处理视图滚动和缩放。原点(0,0)位于视图的左上角。

常见的位置坐标转换

  1. QPoint QMouseEvent::pos()
    这个只是返回鼠标事件相对这个widget(重载了QMouseEvent的widget)的位置。
  2. QPoint QMouseEvent::globalPos()
    窗口坐标,这个是返回鼠标的全局坐标,相对于屏幕的左上角
  3. QPoint QCursor::pos()
    返回相对显示器的全局坐标
  4. QPoint QWidget::mapToGlobal(const QPoint & pos) const
    将窗口坐标转换成显示器坐标
  5. QPoint QWidget::mapFromGlobal(const QPoint & pos) const
    将显示器坐标转换成窗口坐标
  6. QPoint QWidget::mapToParent(const QPoint & pos) const
    将窗口坐标获得的pos转换成父类widget的坐标
  7. QPoint QWidget::mapFromParent(const QPoint & pos) const
    将父类窗口坐标转换成当前窗口坐标
  8. QPoint QWidget::mapTo(const QWidget * parent, const QPoint & pos) const
    将当前窗口坐标转换成指定parent坐标。
  9. QWidget::pos() : QPoint
    这个属性获得的是当前目前控件在父窗口中的位置
  10. const QPointF & QMouseEvent::screenPos() constQPoint 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左上角为原点的坐标

举报

相关推荐

0 条评论