您的位置:首页 > 编程语言 > Qt开发

关于Qt的窗口以及视口的问题

2017-09-29 15:31 337 查看
搞了好久,终于明白了窗口以及视口是什么,两者之间的关系是啥

首先窗口有它自己的物理坐标,比如说一个QSize(400,300)的窗口,它的坐标系统就是以左上角为原点,右下角的点为QPoint(300,400)

然后我们setWindow(-100,-100,100,100)的坐标系,这个便是逻辑坐标,画图语句执行draw时就是基于这个逻辑坐标的

这时候,我们画一个QRect(-90,-80,10,10)的矩形,它的原点坐标是(-100,100),长宽是50,50,那通过窗口视口转换,我们来算一下

默认的视口坐标系统是一个QRect(0,0,300,400)的矩形,所以算出原点的x为(-90-(-100))/100*400 = 40,y为(-80-(-100))/100*300 = 60, 也就是画这个矩形的左上角为(40,60)

再算宽度10/100*400 = 40, 长度10/100 * 300= 30,也就是Rect(40,60,40,30)

之后我们们改变视口坐标,

int side = qMin(width(), height());

int x = width() - side/2;

int y = height() - side/2;

painter.setViewport(x,y,side,side);

网络上常用的一个视口设置,也就是把窗口右下角的一块正方形作为视口,宽度为长宽的较小值,要注意的一点,这个视口的长宽是side,但是在窗口的可以看到的长宽只有side/2,如果你把做这个视口画满的话,会有3/4不在可视范围之内,当然这是在你paintEvent里实时设置视口的情况下,如果设置一个固定的视口,窗口的范围可以完全包括这个视口,你就算画的超出视口范围也是可以的,要记住,视口是用提供转换的,它不会限制显示范围

继续上面的例子:这时候视口被设置为QRect(250,150,300,300),我们再来计算一下那个矩形的位置以及大小

原点是x: (-90-(-100))/100*300+250 = 280  y: (-80-(-100))/100*300+150 = 210 ,长度10/100*300 = 30 , 高度为10/100*300 = 30 ,也就是矩形为QRect(280,210,30,30)

总结一下,画图的时候,总是在逻辑坐标上画图,使用setwindow函数设置,默认是QRect(0,0,width(),height()),在设备上绘制时根据物理坐标来画,它的默认值同样也是QRect(0,0,width(),height()),使用setViewPort设置,根据物理坐标和逻辑坐标之间的映射关系,把我们画在逻辑坐标上的图片画在物理坐标里面

关于走形的问题,只要Window()和ViewPort()的宽高比例一直保持一直,那么就不会出现走形的问题

这个文章,用来个人记录,方便以后查询
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: