参考书籍:《Qt5.9C++开发指南》
一直不理解书中这部分内容及代码:
设置窗口大小为400*400,在正中绘制一个矩形,此时视口和窗口默认重合,默认参数为:
painter.setWindow(0, 0, 400, 400);//窗口
painter.setViewport(0, 0, 400, 400);//视口
QPoint points[4] = {
QPoint(100,100),
QPoint(100,300),
QPoint(300 ,300),
QPoint(300,100),
};
先来看setWindow();
painter.setWindow(-100, -100, 400, 400);//窗口
运行后结果:
可以看出显示窗口相对于图像整体向左平移100像素,向上平移100像素,窗口长宽保持为400,,因此图像出现在右下角。
可以认为setWindow改变的是窗口相对于图像的位置,但是放大缩小窗口时,由于窗口大小是固定的400,所以图像也会跟着变形,及窗口的样子不影响窗口的大小,是一种等比例变换。
接下来看setVIewport()
先说结论:setWindow和setViewport是一种线下映射关系,关系式如下:
从关系是可以看出a、c控制缩放倍数,b、d控制偏移。
默认情况下窗口左上及右下坐标为(0,0)和(400,400),视口也是(0,0)和(400,400),代入解的a=1,c=1,b=0,d=0;
即不进行变换。
更改参数为
painter.setWindow(0, 0, 400, 400);//窗口
painter.setViewport(0, 0, 400, 200);//视口
显示效果为:
从显示效果看,显示效果在Y轴上压缩一半。
此时窗口左上和右下坐标为(0,0),(400,400)
视口左上和右下坐标为(0,0),(400,200)
带入方程解得:a=1,c=1/2,b=0,d=0;
即x方向上(width)比例保持不变,y方向上(height)变为原来1/2.
通过改变参数可以改变相应的显示效果。
参考::QT 窗口与视口(setWindow/setViewPort)的一些理解与整理 - 掘金 (juejin.cn)