如何理解Qt的viewport视图区

2025-04-07 13:12:00

1、通过窗口-视图变换,我们可以定制逻辑坐标系。同时使得绘图代码独立于绘图设备。譬如,逻辑坐标上从(-50,-50)到(50,50),(0,0)点在中心。那么painter的绘图窗口就可以如下图设置:

如何理解Qt的viewport视图区

2、这样逻辑坐标(-50,-50)就对应到绘图设备的物理坐标(0,0)了。setViewport()函数和setWindow(傧韭茆鳟)函数是一对姐妹函数,一个设置物理设备坐标系,一个设置逻辑坐标系。默认情况,两者是一样的。通过设置“window”或者viewport矩形区域,我们就可以对这两个坐标系进行线性变换了。因此,一般我们为了防止变形,viewport和”window“会保持一个相同的宽高比。我们通常的绘图操作是在viewport坐标系实现的,独立于绘图设备的。这里窗口-视图区的转换仅仅是一个线性转换,并不会进行裁剪动作。意思就是如果你在当前设置的window中绘图,图形依然会通过同样的线性代数方式被转换到viewport。视图区,窗口,和转换矩阵决定了逻辑QPainter坐标如何映射到绘图设备坐标系的方式。通常,world转换矩阵是唯一的矩阵,窗口和视图区的设置等价于绘图设备的设置。如同上图所描述的,虽然world,window和device的坐标系等价,但是因为我们可以进行转换,所以他们的坐标系是可以改变的。这里我来看一个例子,说明一下window和viewport具体的区别。

如何理解Qt的viewport视图区

3、上图中,我设置了Painter画一条对角线,先设置widget窗口的大小(600,600),然后画一条线,这里没有设置window和viewport,于是这条线该是多长就多长。

如何理解Qt的viewport视图区

4、接下来,我设置painter的window区域(200,200),然后无论我怎么拉伸窗口,对角线都是跟随窗口变化的,如下图。

如何理解Qt的viewport视图区
如何理解Qt的viewport视图区

5、然后我设置window区域(600,600)。这时候,和我们刚开始看到的图形就是一样的了,也就是说刚才设置了window以后,窗口window被放大到铺满整个widget了。

如何理解Qt的viewport视图区
如何理解Qt的viewport视图区

6、通过打印widget的大小,我们发现widget的大小蚤疣毖扒依然是(600,600),也就是说window没有设置成(200,200),经查证,Qt这里是会自动转掊测汹权换坐标系的,所以我们需要按下图这样设置一下坐标转换不使能。setViewTransformEnabled(false);

如何理解Qt的viewport视图区
如何理解Qt的viewport视图区

7、接下来,我再设置viewport。Viewport表示设备的坐标系。如下图,可以看到,viewport大小是(100,100),洹彭岣啬而drawLine是(600,600),但是线条并没有600,而是被viewport限制了,Painter画线按照设备viewport-window的转换的某种线性关系画了。

如何理解Qt的viewport视图区
如何理解Qt的viewport视图区
如何理解Qt的viewport视图区
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢