关于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()的宽高比例一直保持一直,那么就不会出现走形的问题
这个文章,用来个人记录,方便以后查询
首先窗口有它自己的物理坐标,比如说一个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()的宽高比例一直保持一直,那么就不会出现走形的问题
这个文章,用来个人记录,方便以后查询
相关文章推荐
- 关于 QT的 No such file or directory 问题以及pro文件变量
- 关于QT中中文乱码以及显示常量中有换行符的问题
- 补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
- Qt+vs2010创建多窗口时,关于每次创建2个窗口的问题的解决方法
- qt中解决不同平台间编码问题以及登录窗口写法
- 关于Qt中LOGO与窗口图标显示问题的总结
- 关于Console 2窗口内容偏移以及中文输入的问题
- 【转】补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
- 关于Qt窗口之间的传值问题
- QT中使用槽函数来关闭窗口,导致内存泄露的问题以及解决办法
- 关于new、Create、对象以及窗口的一点问题
- 关于窗口Qt线程停止的问题
- Qt关于设置子窗口样式表不生效问题
- 补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
- QT中关于获得窗口尺寸的问题
- QT中关于获得窗口尺寸的问题
- 关于java中window以及子组件的窗口居中问题
- 关于QT 无边框窗口移动问题
- Qt窗口与视口坐标转换
- QT登录窗口调用主窗口一闪而过问题