关于Qt的窗口以及视口的问题
来源:互联网 发布:activiti 源码分析 编辑:程序博客网 时间:2024/06/05 04:25
搞了好久,终于明白了窗口以及视口是什么,两者之间的关系是啥
首先窗口有它自己的物理坐标,比如说一个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的窗口以及视口的问题
- 关于窗口Qt线程停止的问题
- 关于Qt Creator编译输出窗口的乱码的问题
- QT中关于获得窗口尺寸的问题
- 关于Qt窗口之间的传值问题
- QT 的父子窗口问题
- 关于new、Create、对象以及窗口的一点问题
- Qt+vs2010创建多窗口时,关于每次创建2个窗口的问题的解决方法
- qt 中窗口以及窗口部件背景图案的设置
- 认识QT ----- 多窗口以及窗口之间的传值
- (QT)QT遇到的问题以及解决方法
- QT中使用槽函数来关闭窗口,导致内存泄露的问题以及解决办法
- 关于BeginSheet 的窗口问题
- 关于BeginSheet 的窗口问题
- 补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
- 关于学习QT的那些坑比的日子——窗口汉化乱码问题
- qt widget 窗口句柄的问题
- 关于Qt中LOGO与窗口图标显示问题的总结
- vue-cli 脚手架搭建
- JS页面跳转代码
- 论文发表费用影响因素
- git全自动打android repo tag
- 通过js将时间戳转换成"yyyy--mm--dd"格式
- 关于Qt的窗口以及视口的问题
- 鼠标放上去图片会变大
- 指针和运算符优先级
- 用户行为日志-js埋点(一)实现整体流程
- PHP写注册登录界面有关表单的低级错误
- intelij破解方法
- 回到顶部
- tomcat处理请求
- 测试博客