The Graphics View Coordinate System(Qt翻译)

Graphics View以笛卡尔坐标系为基础,items在scene上的位置和几何结构由x坐标和y坐标表示。当我们用未转置的view来观察scene时,scene中的一个单元由屏幕中的一个像素表示。

注:由于Graphics Views使用Qt的坐标系,y轴反向(y轴正方向向上)的坐标系是不支持的。

Graphics View中有三个实用的坐标系:item坐标系、scene坐标系和view坐标系。

为了简化坐标系相关代码,Graphics View提供了便捷的函数,以方便在三个坐标系间转换。

转换坐标时,scene坐标系相当于QPainter的逻辑坐标系,view坐标系相当于设备(device)坐标系,你可以在索引里搜索:Coordinate System,阅读有关两坐标系之间的关系。

Item坐标系

Item拥有它们自己的逻辑坐标系。坐标系的原点(0,0)通常在它的中心。它同时也是坐标转换的中心。item坐标系中的基本几何图形:item点、item线、和item矩形(存在一个item中画了几个子item的情况)。

当你创建自己的item时,item坐标系是重点; QGraphicsScene and QGraphicsView会提供其他两个坐标系的坐标转换功能。这样以来,实现自己的item就很简单了,例如,如果你收到一个mouse press或drag enter事

件,event的位置是在item坐标系中给出的。当一个点在你的item里时,虚函数QGraphicsItem::contains()返回ture,函数的参数是item坐标系中的一个点。同样,item的 bounding rect 和 shape函数返回值也是在item坐标系中。

item的位置指:item的中心点在父坐标系(parent‘s coordinate system)中的位置;sometimes referred to as parent coordinates。scene相当于所有没有父组件的item的parent。顶级items的位置在scene坐标系中。

子坐标系是相对于父坐标系而言的。若子组件没有transformed,父、子坐标系间的差距就如item和父组件的差距一样。例如,如果一个untransformed的子组件精确位于其父组件的中心点,那么这两个item的坐标系是完全相同的。如果子组件的坐标是(10,0),那么在子坐标系中的(0,10)点,就是父坐标系中的(10,10)点。

因为组件的位置和transformation都与其父组件有关,但父组件的transformation不会影响到子组件的坐标系,虽然父组件暗中transforms了子组件。在以上的例子中,即使父组件旋转或是缩放,子组件的(0,10)点依然与父组件的(10,10)点重合。然而,相对于scene,子组件会跟随父组件的transformation和位置。如果父组件放大2倍,那么子组件的位置会在scene的(20,0)点,它的(10,0)点会在scene的(40,0)点。

忽略item或它的父组件的transformation,QGraphicsItem‘s的函数在item坐标系中进行操作, QGraphicsItem::pos()函数是少数几个例外 。例如,QGraphicsItem::boundingRect()函数返回的是item坐标系中的坐标。

scene坐标系

scene代表了所有items的基础坐标系统,scene坐标系描述了所有顶级item的位置,同时也是所有从view传到scene中的event的基础。scene中的每个item,除了item坐标系中的位置和边界,还有它的scene位置和边界(QGraphicsItem::scenePos(), QGraphicsItem::sceneBoundingRect())。其中item的scene边界区域,也是scene确定哪些区域发生了改变的关键。scene发生改变时,发出信号: QGraphicsScene::changed() ,其参数就是一个scene中rectangles的列表。

view坐标系

view坐标系是widget的坐标系。view坐标系中的每个单元都是一个像素。其特点是:与widget或视口(viewport)相关,且不被所观察的scene影响。view的左上角坐标是(0,0),右下角坐标是(viewport width,viewport height)。所有鼠标事件和drag、drop事件的最原始的接收者是view坐标系,为了与items进行交互,你需要将这些坐标映射到scene坐标系。

坐标映射

当处理scene中的items时,经常需要将坐标和任意形状映射从scene坐标系到item坐标系,有时从一个item坐标系映射到另一个item坐标系,或是从view坐标系映射到scene坐标系。

例如,当你在viewport中点击鼠标时,你可以问scene鼠标下点击的是哪个item(  QGraphicsView::mapToScene()-》QGraphicsScene::itemAt())

如果你想知道scene中的item位于viewport的什么位置,可以先调用

item的 QGraphicsItem::mapToScene() ,然后调用view的mapFromScene()。你如果还想知道view中一个椭圆里有哪些items,

将QPainterPath作为参数传给mapToScene()。然后将映射后的path作为参数传递给 QGraphicsScene::items()。

你可以将坐标和形状映射到scene或从scene映射回来,通过函数:QGraphicsItem::mapToScene() and QGraphicsItem::mapFromScene()。你也可以映射到父组件或映射回来,通过函数: QGraphicsItem::mapToParent() 和QGraphicsItem::mapFromParent()。或者在item之间进行映射,通过函数: QGraphicsItem::mapToItem() and QGraphicsItem::mapFromItem()。所有的映射函数都能处理点、矩形、多边形和pahts。

在view中也存在着同样的函数来完成与scene之间的映射。QGraphicsView::mapFromScene() and QGraphicsView::mapToScene(),从view映射到item,需要scene作为中转。

Key Features

zooming and rotating

Pringting

Drag and Drop

CUrsors and Tooltips

Animation

OpenGL Rendering

Item Groups

Widgets and Layouts

Embedded Widget Supporting

时间: 2024-08-28 06:06:26

The Graphics View Coordinate System(Qt翻译)的相关文章

qt Graphics View Framework(非重点)

Graphics View 提供了一种接口,用于管理大量自定义的 2D 图形元素,并与之进行交互:还提供了用于将这些元素进行可视化显示的观察组件,并支持缩放和旋转. 说明;Graphics View 框架包含了一套完整的事件体系,可以用于与场景中的元素进行双精度的交互.这些元素同样支持键盘事件.鼠标事件等. Graphics View 使用了 BSP 树(Binary Space Partitioning tree,这是一种被广泛应用于图形学方面的数据结构)来提供非常快速的元素发现,也正因为如此

pyqt5 graphics view简单使用

Graphics View提供了一个平面,用于管理和交互大量自定义的2D图形图元,以及一个用于可视化图元的视图窗口小部件,支持缩放和旋转. 该框架包括一个事件传播架构,允许场景中图元的精确双精度交互功能.图元可以处理关键事件,鼠标按下,移动,释放和双击事件,还可以跟踪鼠标移动. Graphics View使用BSP(二进制空间分区)树来提供非常快速的图元发现,因此,即使有数百万个图元,它也可以实时显示大型场景. 先说一下这里面的坐标系: 图形视图基于笛卡尔坐标系(平面直角坐标系x.y轴); 场景

Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻译 Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译 Unity性能优化(3)-官方教程Optimizing garbage collection in Uni

QT翻译上下文

QT翻译机制还是比较复杂的,实际翻译调用的是QCoreApplication的translate,如下: translate的参数除了翻译的原文之外,另外还有一个很重要的是context(也就是上下文), 下面来看如下场景的写法,例如我边写了一个类,从QObject派上,而且加上了Q_OBJECT的宏,则演示代码如下: namespace FirstLevel { namespace SecondLevel{ MyClass::MyClass() { } void MyClass:doSomet

DICOM-RT:放疗系统的坐标系统DICOM-RT Coordinate System

背景: 继上一篇博文后,继续科普肿瘤放疗领域中的相关概念.文中的知识点都来自于相关的官方或相关企业文档,仅从相关行业从业者的角度来进行阐述,由于本人不是放疗医生和技师,因此可能与实际工作中的环节有出入,欢迎大家来邮交流,共同进步. 本博文开篇让我从最熟悉的DICOM文件格式说起,相较于普通的bmp图像而言,DCM是结合了患者.医院.设备等相关信息于像素数据之上的文件.但单单从像素数据来看,两者同样存在着差异: 标准的BMP文件像素存储顺序是由左到右.由下到上,即坐标原点为图像左下角:而DICOM

Graphics View绘图架构(二)

Graphics View结构的主要类包括:视图类QGraphicsView.场景类QGraphicsScene.和各种图形项类(基类都是 QGraphicsItem) 1. QGraphicsView 用于观察一个场景的物理窗口 场景小于视图,整个场景在视图中可见:当场景大于视图时,试图自动提供卷滚条 QGraphicsView的视口坐标等于显示设备的物理坐标,但是可以对QGraphicsView的坐标进行平移.旋转和缩放 设置接口函数如下: 场景 void     setScene()  /

Animated progress view with CAGradientLayer(带翻译)

原文网址:使用CAGradientLayer的动画精度条View Modern software design is getting flatter and thinner all the time. Another trend that follows suit is the thin, one pixel progress bar that you see at the top of websites and apps. You’ve seen in it on Medium blogs,

Qt翻译---Thread Support in Qt

Thread Support in Qt QT提供线程支持在平台独立的线程类.一个安全线程的传递事件的方式,一个信号槽的链接在线程之中.这使得开发多线程容易.多线程程序也是一个有用的范例为不冻结用户界面情况下的耗时的操作. 推荐阅读: 这个文件打算给有多线程的知识和经验的读者.如果你是新手,看我们推荐的阅读清单. Threads Primer: A Guide to Multithreaded Programming Thread Time: The Multithreaded Programm

A trip through the graphics pipeline 2011 Part 10(翻译)

之前的几篇翻译都烂尾了,这篇希望....能好些,恩,还有往昔呢. ------------------------------------------------------------ 第十部分 译:minggoddess 欢迎回来.上一次,我们一头扎进了像素管线的最底端.这次,切换到管线的中间位置看一下伴随D3D10而来的大概是最引人注目扩展:几何着色器(Geometry Shaders). 但首先呢,我会先讲一下我在本系列中如何分解图形管线,这与你从APIs角度看到的景象是多么的不同. 多