QT图形显示和处理2 坐标系统(重点)
上一节我们讲了基本的绘图,这一节将重点讲述什么是二维坐标系。
大多数博客和书对QT的坐标讲解非常粗浅,两个非常重要的函数setWindow和setViewport都没有说清楚。这一节将重点讲一下坐标系统。
先上一段代码:
QPainter painter(this);
QPen pen(Qt::green,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
painter.setPen(pen);
painter.drawLine(QPoint(50, 50), QPoint(150, 150));
painter.save();
painter.rotate(10);//旋转是绕着坐标0点旋转的
painter.drawLine(QPoint(50, 50), QPoint(150, 150));
painter.restore();
这些跟上一节一样,都是定义在paintEvent里面的。首先先画了一条线,然后保存当前坐标系,把坐标系转了10度,然后画线,最后再恢复原来的坐标系。
什么意思呢?其实就是整个坐标系包括里面画的东西沿着原点(0,0)顺时针转了10度,再显示到屏幕上:
注意这里的绿色方框代表了窗口。程序显示结果如下:
注意上面的是第一条线,下面的是转下去的第二条线。
我们再讲一下什么是默认坐标系:
我们创建的窗口大小是1100*800的,默认状态下,它的坐标系就是:左上角是(0,0),右下角是(1100,800)。我们画线(50,50)——(100,100),就会在该坐标系上画出来。
现在我们重新设置一下坐标系:
painter.setWindow(-width() / 2, -height() / 2, width(), height());
painter.drawLine(QPoint(0, 0), QPoint(150, 150));
painter.save();
painter.rotate(90);//旋转是绕着坐标0点旋转的
painter.drawLine(QPoint(0, 0), QPoint(150, 150));
painter.restore();
显示效果如下:
首先先看这句话:
painter.setWindow(-width() / 2, -height() / 2, width(), height());
这句话把窗口的最左上角设置为了(-width() / 2, -height() / 2),width()和height()是窗口的长和宽。经过这样设置,以前的窗口中心坐标是(width() / 2, height() / 2),现在的窗口的中心点变成了(0,0)。即setWindow把窗口进行重新设置,前两个参数设最左上角的点的坐标,后两个参数设置长和宽。
为了更好理解,我们再添加这么一段程序:
painter.setWindow(-100, -100, 200, 200);
painter.drawLine(QPoint(-100, -100), QPoint(100, 100));
现在显示的效果如下:
注意,这样设置相当于把(-100,-100)——(100,100)之间的内容映射到原来(0,0)——(1100,800)的窗口里,所以这个线不是45度的,因为不是等长宽比映射,以及它变粗了,因为映射放大了。
所以,setWindow的意义在于,我们已经定义一个区间,在这个区间上画的内容会被映射到真实的显示区域(物理区域)。
而大家应该记得之前说的,rotate是绕着原点(0,0)旋转整个屏幕的,所以说中间的成90度的角就是这么旋转过去的。
大家仔细理解一下setWindow的效果,然后下一节会重点介绍另一个函数:setViewport,这是坐标系统里最难理解的部分。