Qt学习: 坐标系统详解

想来初学Qt的小伙伴,一定对于Qt中的坐标系问题感到疑惑,下面将详细解释下Qt中的坐标系以及转化.
1.世界坐标和模型坐标.
那么,什么是世界坐标呢?其实很简单,我们可以把电脑屏幕当成一个世界,世界坐标就是,电脑上的一个位置(这里可以看成一个点)相对于左上角的位置.因为是ui界面,所以是一个以左上角为原点,横轴为x轴,纵轴为y轴的坐标系.为什么取名世界坐标呢?因为这是一个从第三者的角度去理解的,因为你可以纵观全世界,所以可以作为世界坐标.

而模型坐标指的是参考系不单单是屏幕左上角了,可以是周围的任意一个物体,以其他物体为坐标系原点,相对于它的一个坐标,也就是模型坐标,也可以叫做相对坐标.举个例子:当你来到一个大城市里,你打电话文别人现在该怎么走的时候,你肯定先要告诉别人你现在所处的位置吧?这个时候你当然不知道自己的精确位置,只知道自己周围有什么,把周围的一个建筑物当做坐标系原点展开,告诉别人自己的方位,对吧?

模型坐标是相对的,但是我们一般把距离自己最近的且包含自己的一个物体当做参照物,这个参照物被称为父窗口,而参照父窗口的相对位置的窗口或者控件称为子窗口.每个控件都有父窗口,举个例子,看下面的图片:
1.按钮1和按钮2在组合框(QGroupBox也叫组合框)里面,所以他们都是这个组合框的子控件,也可以叫成孩子.
2.这个组合框在标题为’c’的窗口内,所以组合框是窗体的孩子.
3.既然组合框和按钮都有父窗口,那么窗口c是否也有父亲呢?那是肯定的啊.窗口c的父亲就是整个桌面,也就是整个显示器屏幕.
这里写图片描述

1&&1.5 控件的位置.
为什么要单独讲控件的位置呢.因为规定了以控件左上角的位置作为控件的在ui中的位置.对cocos2dx了解的朋友,也知道了这样相当于把锚点设置在点(0,1)上面,当然和Qt没啥关系啦,只需要记住控件的位置就是左上角顶点的位置,窗体也同样如此!

2.QPoint Widget::pos(); //控件的pos()方法返回的到底是什么坐标?
看下图,我们可以下个断点,获取了两个按钮的pos()成员方法返回的坐标,根据这个坐标,再结合上一张图,大概也可以知道这个方法返回的坐标是相对于组合框来说的把.
这里写图片描述
那么就有人要问了,那我们应该通过怎么样的手段才能获取控件的世界坐标呢?既然有问题,当然会得到解决啦~Qt中提供了不同情况下的坐标转换方法,在后面会详细说明.

3.窗体的坐标放置这里写图片描述. //void setGeometry()和void move()的问题.
细心的小伙伴可以发现,窗体由于外面有着标题和图标等框架,所以它差不多有两个坐标,那么问题就来了…到底是哪个坐标呢?
这里写图片描述
看如下情况:我们可以发现当我们设置窗体的几何属性时,放在左上角坐标原点的是2号位置这个内点.

这里写图片描述
我们发现窗体已移动到了原点,且是1号点移动到的原点.
这里写图片描述

所以:
1.当表示窗体的位置时,用的是外点,也就是1号点.
2.当用来计算子窗口在窗体内的位置时,获得的是以内点,也就是2号点为坐标原点的相对坐标.

//Qt中也有两个可以获取这两个点坐标的方法,有兴趣的可以去测试下:
//获得外框架的左顶点.
this->frameGeometry().topLeft();
//获得内窗体的左顶点.
this->geometry().topLeft();

现在我们大概对世界坐标和模型坐标有了基本的概念,Qt也给我们提供了一些关于坐标的方法:
1.QPoint QMouseEvent::globalPos(); //返回鼠标的世界坐标.

2.QPoint QMouseEvent::pos(); //返回鼠标相对于重写鼠标事件虚函数的窗口或者控件的坐标.什么意思呢?举个例子,如果我在主窗口中重写了鼠标事件的虚函数,那么pos()方法返回的就是:以之前说的2号点为原点,展开坐标系,鼠标的位置.

3.QPoint QCursor::pos(); //返回光标的世界坐标,注意!虽然QCursor::pos()和QMouseEvent::globalPos()返回的都是相对于左上角的世界坐标,但是QCursor::pos()方法可以说是实时获取光标的位置的.所以说有些小伙伴在通过下断点调试比较这两个坐标的时候,有时候会在还没有执行QCursor::pos()方法前,就移动鼠标去看坐标了,所以导致出现的两个坐标不相等,其实这两个方法都是获得鼠标的世界坐标.

4.QPoint QWidget::mapToGlobal(const QPoint &pos); //把相对于当前窗口的坐标转化为世界坐标.

5.QPoint QWidget::mapToParent(const QPoint &pos); //把相对于调用该函数的坐标转化为父类Widget的相对坐标.

6.QPoint QWidget::mapTo(QWidget *parent, const QPoint & pos);//把调用该函数的控件的相对坐标转化为指定父类控件的相对坐标.因为可能是多重包含,为了避免多次调用mapToParent(),所以有了这个方法.

7.QPoint QWidget::mapFromGlobal(const QPoint &pos); //把世界坐标转化为相对于调用该函数的控件的坐标.谁调用此函数,谁就是坐标系的原点.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值