View Scene Item 坐标系

本文详细解析了M-V模型的基本概念及应用细节,包括View、Scene和Item的角色定义,重点介绍了坐标系特性、画布大小调整原理及view与scene的绑定方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念:还是比较清晰的,M-V模型,View充当显示,Scene是Model,至于Item则是一个个的具体“物体”

细节就不是那么简单直接了

(1)画布的大小。scene就是画布,大小是可以自行决定的,可以扩大缩小。至少在全部scene在view中可见时,大小不影响画的内容 。

(2)坐标系:V-S-I都是直角坐标,原点是TopLeft,向右下延展,和Win32中的类似。

注意:不同的对象的原点是不一样的。 

比如,scene::addItem的操作,item的位置就是用scene的坐标系,而不是view(后面有内容)

(3)view和scene:QGraphicsView::setScene进行绑定。

注意:默认情况下,如果view可以完全显示scene的内容,则scene的按照居中对齐的方式进行显示;

也就是说scene的中心点和view的中心点是重叠的,但scene的原点仍然是自身sceneRect的左上角。这一点十分坑爹。

可以通过QGraphicsView::setAlignment进行设置

注意:这里提到的是“能完全显示”,而不是尺寸;换句话说,如果因为scene被缩小而完全显示,也是居中显示的。 

注意:这个对齐方式仅用于上述情况,如果scene尺寸大于view,则仍然是左上对齐。

客观评价:符合最终用户的思维,但对习惯了程序思维的程序员有点意外啊。 

### Qt 中 Graphics View 与 Graphics Scene坐标系转换 在Qt框架下,Graphics View体系提供了强大的二维图形处理能力。为了实现不同组件间的交互,尤其是当涉及到视图(View)、场景(Scene)以及具体项目(Item)之间坐标的相互转化时,掌握其内部的坐标映射机制显得尤为重要。 #### 场景到视图的坐标转换 对于从`QGraphicsScene`中的位置转换至对应的`QGraphicsView`上的显示位置而言,可以通过调用`QGraphicsView::mapFromScene()`来完成这一过程[^1]。此方法接收一个或多个参数表示要被转换的点的位置信息,并返回这些点经过变换后的屏幕坐标值。 ```cpp // 将场景坐标转为视图坐标 QPointF viewPos = graphicsView->mapFromScene(scenePoint); ``` #### 视图到场景的坐标转换 相反地,如果希望把发生在某个特定`QGraphicsView`内的事件(比如鼠标的点击动作)所关联的坐标转变为相对于整个`QGraphicsScene`的有效范围,则应该利用`QGraphicsView::mapToScene()`来进行相应的计算: ```cpp // 把视图坐标转化为场景坐标 QPointF scenePos = graphicsView->mapToScene(viewPoint); ``` #### 图形项间坐标互换 除了上述两种情况外,有时还需要考虑如何在一个具体的`QGraphicsItem`对象内执行局部坐标向全局坐标的转变或是反过来的操作。这时可借助于该类提供的两个成员函数——`mapToParent()`和`mapFromParent()`;另外还有用于跨层次结构进行更广泛映射的方法如`mapToItem()`和`mapFromItem()`。 ```cpp // itemA 到 itemB 的坐标转换 QPointF posInItemB = itemA->mapToItem(itemB, pointInItemA); // 或者使用 mapFromItem 进行反向操作 QPointF posInItemA = itemB->mapFromItem(itemA, pointInItemB); ``` 以上便是关于Qt中Graphics View同Graphics Scene两者间常见类型的坐标系转换方式简介。值得注意的是,在实际应用过程中可能还会遇到更加复杂的情形,因此建议开发者深入研究官方文档并结合实例练习以获得更好的理解效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

developer_wgl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值