QPainter的setViewport()视区与setWindow()窗口理解
先看助手说明:
1.QPainter的viewport()与window()分别代表着物理坐标与逻辑坐标区域,默认两个区域是重合的,也就是用户指定的rect区域在两者上是同样的大小、位置。
2.setWindow()可以设置你想指定的rect区域,比如rect=(-50,-50,100,100),此时你定义的逻辑区域左上坐标(-50,-50),右下坐标(50,50),大小(100X100),最重要的是QPainter的drawLine、drawRect或者其它draw操作都是以这个逻辑坐标区域为准来绘制图像的,也就是此时的坐标系原点(0,0)就是(-50,-50)了。
3.SetViewport()设置的是物理坐标区域,它代表着实际显示的区域,切记这只是用户规定的画图区域而不是画图的坐标直接以它为准,你画的图像还是以window()区域的坐标系为准,最终是要将winodw()逻辑区域映射到viewport()物理区域的,这样以后在使用QPainter进行绘制图形时就可以通过设置这两个方法去放大、平移图像了,比如保持window()逻辑坐标不变,将viewport()物理坐标区域大小变为之前的2倍,那么实际显示的图像也会自动放大2倍了,至于平移也差不多,我懒得算了。
4.先拿物理坐标viewport()来说,它既然是实际的绘制显示区域,那么就先单独把它拿出来瞅瞅。我先将界面大小resize(300, 100);然后去定义一块viewport(),看我的样子viewport()的rt是定义成(100,0,100,100)了,具体的自己去算。接下来我填充了viewport()的矩形区域(红色),绘制了一个矩形框(蓝色),但是这样看起来红色和蓝色显示的位置和大小都不太对啊,红色rt(100,0,100,100)大小是个100X100的正方形,而蓝色rect()则是整个widget的QRect(0,0 300x100),怎么想都不太对啊。此时就要讲讲window()了,虽然我没有setWindow(),但是看输出的window()默认值可是QRect(0,0 300x100),将window逻辑区域大小与viewport()物理坐标区域大小进行比较,很明显两者高度相等,但是宽度前者是后者的三倍,也就是说绘制到逻辑坐标区域内的图像映射到实际物理坐标区域后,高度一样,宽度变为原来的三分之一了,这也就解释了为什么红色与蓝色看起来不对的问题。
rect() : QRect(0,0 300x100)
viewport: QRect(100,0 100x100)
window : QRect(0,0 300x100)
从这个例子中,可以很直观的看到window()与viewport()的映射宽度比例为3:1(高度相同),我们绘制的图像都是先绘制到window()的逻辑区域内,然后才映射到viewport()的物理区域内显示出来的,假如我们想绘制一个300X100大小的矩形框,经过映射后实际显示的也只有100X100大小了。
5.再拿逻辑坐标区域window()来说,理解了上边的例子后这个就更简单了。我们知道绘制的图形是要先放到window()区域内,最后映射到实际的物理坐标系中的,这里resize(200, 200),然后直接setWindow(QRect(0, 0, 50, 50)),逻辑坐标区域的大小就变成了50X50了,接下来绘制了两条对角线以及一个矩形框,显示效果如图所示。虽然当前widget的size为200X200,但是绘制的线及矩形框的连接点都是在window()的上下左右四个顶点上(大小都是50X50),而默认的viewport()为this->rect(),即实际物理坐标区域为整个widget的区域,因此不需要管映射的比例是多少,物理坐标区域内实际显示的一定是个对角线以及矩形框。
rect() : QRect(0,0 200x200)
viewport: QRect(200,0 200x200)
window : QRect(0,0 50x50)
小结:viewport()控制图形实际显示的区域在哪,而window()是承载图形绘制的区域,一般视图和窗口的宽高比最好保持一致,否则显示的图形可能会变形的。
from:https://blog.csdn.net/qq_32417149/article/details/102841970