QT图形显示和处理2坐标系统(重点)

mac2024-07-18  47

上一节我们讲了基本的绘图,这一节将重点讲述什么是二维坐标系。

大多数博客和书对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,这是坐标系统里最难理解的部分。

最新回复(0)