GraphicsView Framework图形视图框架(翻译)

来源:互联网 发布:源码平台 编辑:程序博客网 时间:2024/05/25 16:39
昨日查看GraphicsView Framework图形视图框架一些函数用法,英文看球不懂:),就用google翻译把帮助翻译了一把,顺便记录在这里,机器翻译嘛,俺只调整了一小部分,其中肯定有用词不是很准确的地方~仅供参考~

GraphicsView框架

图形视图提供了一个浅层的用于管理和交互大量定制的2D图形项目,以及一个用于可视化Item的View Widget,支持缩放和旋转。

该框架包括允许对场景上的Item的精确的双精度交互能力的事件传播体系结构。 Item可以处理键盘事件,鼠标按下,移动,释放和双击事件,他们还可以跟踪鼠标移动。
图形视图使用BSP(二进制空间分区)树(二叉树)来提供非常快速的Item发现,因此,它可以实时地可视化大型场景,即使有数百万项目。
图形视图在Qt 4.2中引入,取代了其前身,QCanvas。

主题:

图形视图架构

Graphics View提供了一种基于项目的模型视图编程方法,类似于InterView的方便类QTableView,QTreeView和QListView。多个视图可以观察单个场景,并且场景包含不同几何形状的项目。QGraphicsScene提供了图形视图场景。 该场景有以下职责:。提供用于管理大量项目的快速界面。将事件传播到每个项目。管理项目状态,例如选择和焦点处理。提供未转换的渲染功能; 主要用于打印该场景用作QGraphicsItem对象的容器。 通过调用QGraphicsScene ::addItem()将项目添加到场景中,然后通过调用许多项目发现函数之一来检索。 QGraphicsScene :: items()和它的重载返回包含或交叉点,矩形,多边形或一般的矢量路径的所有项目。 QGraphicsScene :: itemAt()返回特定点的最上面的项目。 所有项目发现函数以递减的堆叠顺序返回项目(即,第一个返回的项目是最顶层,最后一个项目是最底层)。
      QGraphicsScene scene;    QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100));    QGraphicsItem*item = scene.itemAt(50, 50);    // item ==rect
QGraphicsScene的事件传播体系结构调度场景事件以传递到项目,并且还管理项目之间的传播。如果场景在特定位置接收到鼠标按下事件,则场景将事件传递到在该位置的任何项目。QGraphicsScene还管理某些项目状态,如项目选择和焦点。 你可以通过调用QGraphicsScene:: setSelectionArea()来选择场景中的项目,传递任意形状。此功能也用作QGraphicsView中橡皮筋选择的基础。要获取所有当前选定项目的列表,请调用QGraphicsScene :: selectedItems()。 QGraphicsScene处理的另一个状态是一个项目是否有键盘输入焦点。 你可以通过调用QGraphicsScene:: setFocusItem()或QGraphicsItem :: setFocus()设置焦点,或通过调用QGraphicsScene:: focusItem()获取当前焦点项目。最后,QGraphicsScene允许您通过QGraphicsScene:: render()函数将场景的部分渲染为绘制设备。您可以在本文档后面的“打印”部分中了解更多信息。

The View 视图

QGraphicsView提供了视图窗口小部件,它可视化场景的内容。 您可以将多个视图附加到同一场景,以向同一数据集提供多个视口。视图窗口小部件是一个滚动区域,并提供用于浏览大型场景的滚动条。要启用OpenGL支持,可以通过调用QGraphicsView :: setViewport()将QGLWidget设置为视口。
    QGraphicsScene scene;    myPopulateScene(&scene);    QGraphicsViewview(&scene);    view.show();
该视图接收来自键盘和鼠标的输入事件,并且在将事件发送到可视化场景之前将它们转换为场景事件(在适当时将用于场景坐标的坐标转换)。使用它的变换矩阵,QGraphicsView:: transform(),视图可以转换场景的坐标系统。这允许高级导航功能,如缩放和旋转。为了方便,QGraphicsView还提供了用于在视图和场景坐标之间转换的函数:QGraphicsView :: mapToScene()和QGraphicsView ::mapFromScene()。The Item 项目QGraphicsItem是场景中图形项的基类。图形视图为典型形状提供了几个标准项目,例如矩形(QGraphicsRectItem),椭圆(QGraphicsEllipseItem)和文本项目(QGraphicsTextItem),但是最强大的QGraphicsItem功能在您编写自定义项目时可用。其中,QGraphicsItem支持以下功能:。鼠标按下,移动,释放和双击事件,以及鼠标悬停事件,滚轮事件和上下文菜单事件。。键盘输入焦点和键事件。拖放。分组,通过父子关系,和QGraphicsItemGroup。碰撞检测Items存在于局部坐标系中,并且像QGraphicsView一样,它还提供了许多用于映射项目和场景之间以及从一个项到另一个项的坐标的函数。此外,像QGraphicsView,它可以使用矩阵变换其坐标系:QGraphicsItem :: transform()。这对于旋转和缩放单个项目很有用。Items可以包含其他项目(子项目)。 父项目的转换由其所有子项继承。 然而,不管项目的累积变换,其所有的函数(例如,QGraphicsItem :: contains(),QGraphicsItem ::boundingRect(),QGraphicsItem :: collidesWith())仍然在本地坐标操作。QGraphicsItem支持碰撞检测通过QGraphicsItem:: shape()函数和QGraphicsItem :: collidesWith(),它们都是虚拟函数。 通过将您的项目的形状作为局部坐标QPainterPath从QGraphicsItem:: shape()返回,QGraphicsItem将处理所有的碰撞检测。如果你想提供自己的碰撞检测,无论如何,你可以重新实现QGraphicsItem :: collidesWith()。这些类提供了一个用于创建交互式应用程序的框架。

QAbstractGraphicsShapeItem 所有路径项的公共基础
QGraphicsAnchor 表示QGraphicsAnchorLayout中两个项目之间的锚点
QGraphicsAnchorLayout 在图形视图中可以将小部件锚定在一起的布局
QGraphicsEffect 所有图形效果的基类
QGraphicsEllipseItem 椭圆项目,您可以添加到QGraphicsScene
QGraphicsGridLayout 用于在图形视图中管理窗口小部件的网格布局
QGraphicsItem QGraphicsScene中所有图形项的基类
QGraphicsItemGroup 将一组项目视为单个项目的容器
QGraphicsLayout 图形视图中所有布局的基类
QGraphicsLayoutItem 可以继承以允许您的自定义项目由布局管理
QGraphicsLineItem 可以添加到QGraphicsScene的订单项
QGraphicsLinearLayout 用于在图形视图中管理窗口小部件的水平或垂直布局
QGraphicsObject 需要信号,插槽和属性的所有图形项的基类
QGraphicsPathItem 可以添加到QGraphicsScene的路径项
QGraphicsPixmapItem 可以添加到QGraphicsScene的Pixmap项
QGraphicsPolygonItem 多边形项目,您可以添加到QGraphicsScene
QGraphicsProxyWidget 用于在QGraphicsScene中嵌入QWidget的代理层
QGraphicsRectItem 您可以添加到QGraphicsScene的矩形项
QGraphicsScene Surface用于管理大量2D图形项目
QGraphicsSceneContextMenuEvent 上下文菜单事件在图形视图框架中
QGraphicsSceneDragDropEvent 用于在图形视图框架中拖放的事件
QGraphicsSceneEvent 所有图形视图相关事件的基类
QGraphicsSceneHelpEvent 请求工具提示时的事件
的QGraphicsSceneHoverEvent 在图形视图框架中悬停事件
QGraphicsSceneMouseEvent 鼠标事件在图形视图框架中
QGraphicsSceneMoveEvent 窗口小部件在图形视图框架中移动的事件
QGraphicsSceneResizeEvent 在图形视图框架中调整窗口小部件的事件
QGraphicsSceneWheelEvent 在图形视图框架中轮播事件
QGraphicsSimpleTextItem 可以添加到QGraphicsScene的简单文本路径项
QGraphicsSvgItem QGraphicsItem可以用来渲染SVG文件的内容
QGraphicsTextItem 可以添加到QGraphicsScene以显示格式化文本的文本项
QGraphicsTransform 用于在QGraphicsItems上构建高级变换的抽象基类
QGraphicsView 用于显示QGraphicsScene的内容的小部件
QGraphicsWidget QGraphicsScene中所有小部件项的基类
QStyleOptionGraphicsItem 用于描述绘制QGraphicsItem所需的参数

坐标系统

图形视图基于笛卡尔坐标系; 项目在场景上的位置和几何结构由两个数字的集合表示:x坐标和y坐标。当使用未变换视图观察场景时,场景上的一个单元由屏幕上的一个像素表示。注意:由于图形视图使用Qt的坐标系,不支持反向Y轴坐标系(其中y向上增长)。在图形视图中有三个有效的坐标系:Item坐标,scene坐标和view坐标。 为了简化实现,图形视图提供了方便的功能,允许您在三个坐标系之间进行映射。渲染时,图形视图的场景坐标对应于QPainter的逻辑坐标,视图坐标与设备坐标相同。 在坐标系文档中,您可以阅读有关逻辑坐标和设备坐标之间的关系。

Item Coordinates 项目坐标

项目存在于它们自己的局部坐标系中。 它们的坐标通常以它的中心点(0,0)为中心,这也是所有变换的中心。项目坐标系中的几何图元通常被称为项目点,项目线或项目矩形。创建自定义项目时,项目坐标是您需要关注的;QGraphicsScene和QGraphicsView将为你执行所有的转换。这使得它很容易实现自定义项目。例如,如果您收到鼠标按下或拖动输入事件,则事件位置在项目坐标中给出。 QGraphicsItem :: contains()virtual函数,如果某个点在你的项目内部则返回true,否则为false,在项目坐标中采用点参数。类似地,项目的边界矩形和形状在项目坐标中。项目位置是项目中心点在其父坐标系中的坐标;有时称为父坐标。在这个意义上,场景被视为所有无父项的“父”。顶级项目的位置是在场景坐标中。子坐标是相对于父坐标的坐标。 如果子项未变换,子坐标和父坐标之间的差异与父坐标中项目之间的距离相同。 例如:如果未转换的子项目精确地位于其父中心点,则两个项目的坐标系统将是相同的。然而,如果孩子的位置是(10,0),孩子的(0,10)点将对应于其父的(10,10)点。因为项目的位置和变换是相对于父项,子项目的坐标不受父项变换的影响,尽管父项的变换隐式地变换子项。在上面的示例中,即使父对象被旋转和缩放,子对象的(0,10)点仍然对应于父对象的(10,10)点。然而,相对于场景,孩子将遵循父母的变换和位置。如果缩放父节点(2x,2x),孩子的位置将在场景坐标(20,0),并且其(10,0)点将对应于场景上的点(40,0)。使用QGraphicsItem ::pos()是少数例外之一,QGraphicsItem的函数操作在项目坐标,无论项目,或任何其父的转换。例如,项目的边界rect(即QGraphicsItem :: boundingRect())总是在项目坐标中给出。

Scene Coordinates 场景坐标

场景表示其所有项目的基本坐标系。 场景坐标系统描述每个顶级项目的位置,并且还形成从视图传递到场景的所有场景事件的基础。场景上的每个项目都有一个场景位置和边界矩形(QGraphicsItem :: scenePos(),QGraphicsItem ::sceneBoundingRect()),除了它的本地项目pos和边界矩形。场景位置描述项目在场景坐标中的位置,并且其场景定界矩形成QGraphicsScene如何确定场景的哪些区域已经改变的基础。场景中的变化通过QGraphicsScene :: changed()信号传递,参数是场景矩形列表。

View Coordinates 视图坐标

视图坐标是窗口小部件的坐标。 视图坐标中的每个单位对应于一个像素。 这个坐标系统的特别之处在于它相对于窗口部件或视口,并且不受观察到的场景的影响。 QGraphicsView的视口的左上角总是(0,0),右下角总是(视口宽度,视口高度)。所有鼠标事件和拖放事件最初作为视图坐标接收,您需要将这些坐标映射到场景,以便与项目进行交互。

Coordinate Mapping 坐标映射

通常当处理场景中的项目时,将坐标和任意形状从场景映射到项目,从项目到项目,或从视图映射到场景可能是有用的。例如,当您在QGraphicsView的视口中单击鼠标时,可以通过调用QGraphicsView :: mapToScene(),然后通过QGraphicsScene:: itemAt()来询问场景下的什么项目。如果你想知道项目在视口中的位置,你可以在项目上调用QGraphicsItem :: mapToScene(),然后在视图上调用QGraphicsView:: mapFromScene()。最后,如果你想要查找什么项目在视图椭圆内,你可以传递一个QPainterPath到mapToScene(),然后将映射路径传递给QGraphicsScene :: items()。你可以通过调用QGraphicsItem:: mapToScene()和QGraphicsItem :: mapFromScene()来映射坐标和形状到项目的场景。 您还可以通过调用QGraphicsItem:: mapToParent()和QGraphicsItem :: mapFromParent()或项目之间通过调用QGraphicsItem:: mapToItem()和QGraphicsItem :: mapFromItem()映射到项目的父项。 所有映射函数都可以映射点,矩形,多边形和路径。视图中提供了相同的映射函数,用于映射到场景和从场景映射。 QGraphicsView :: mapFromScene()和QGraphicsView ::mapToScene()。要从视图映射到项目,您首先映射到场景,然后从场景映射到项目。

主要特征

缩放和旋转

QGraphicsView支持与QPainter通过QGraphicsView:: setMatrix()相同的仿射变换。通过对视图应用变换,您可以轻松添加对常见导航功能(如缩放和旋转)的支持。这里是一个示例如何实现缩放和旋转插槽在QGraphicsView的子类:
      class View :public QGraphicsView    {        Q_OBJECT            ...        public slots:                void zoomIn() { scale(1.2, 1.2); }                void zoomOut() { scale(1 / 1.2, 1 / 1.2); }                void rotateLeft() { rotate(-10); }                void rotateRight() { rotate(10); }                ...    };
槽可以连接到QToolButtons,并启用autoRepeat。   QGraphicsView保持视图的中心对齐,当您转换视图。有关显示如何实现基本缩放功能的代码,另请参阅Elastic Nodes示例。

打印

(貌似应该是叫输出更合适
Graphics View通过其渲染函数QGraphicsScene:: render()和QGraphicsView :: render()提供单行打印。 这些函数提供相同的API:通过将QPainter传递到任何一个渲染函数,您可以让场景或视图将所有或部分内容渲染到任何绘图设备中。此示例显示如何使用QPrinter将整个场景打印为整页。

    QGraphicsScene scene;    scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black),QBrush(Qt::green));    QPrinterprinter;    if(QPrintDialog(&printer).exec() == QDialog::Accepted)     {            QPainter painter(&printer);            painter.setRenderHint(QPainter::Antialiasing);            scene.render(&painter);    }
场景和视图呈现功能之间的差别在于,一个在场景坐标中操作,另一个在视图坐标中操作。 QGraphicsScene :: render()通常优选用于打印未转换的场景的整个段,例如用于绘制几何数据或用于打印文本文档。 QGraphicsView :: render(),另一方面,是适合截取屏幕截图; 它的默认行为是使用提供的绘图器渲染视口的确切内容。
QGraphicsScene scen;scene.addRect(QRectF(0, 0, 100, 200), QPen(Qt::black),QBrush(Qt::green));QPixmap pixmap;QPainter painter(&pixmap);painter.setRenderHint(QPainter::Antialiasing);scene.render(&painter);painter.end();pixmap.save("scene.png");
当源和目标区域的大小不匹配时,源内容被拉伸以适合目标区域。 通过将Qt ::AspectRatioMode传递给您正在使用的渲染函数,可以选择在内容拉伸时保持或忽略场景的宽高比。

Drag and Drop 拖放

因为QGraphicsView间接继承QWidget,它已经提供了与QWidget提供的相同的拖放功能。 此外,为了方便起见,图形视图框架为场景以及每个项目提供拖放支持。当视图接收到拖动时,它将拖放事件转换为QGraphicsSceneDragDropEvent,然后将其转发到场景。 场景接管此事件的调度,并将其发送到接受拖动的鼠标光标下的第一个项目。要从项目开始拖动,请创建QDrag对象,将指针传递到启动拖动的小部件。 项目可以同时被许多视图观察到,但只有一个视图可以启动拖动。 在大多数情况下,拖动是由于按下或移动鼠标而启动的,因此在mousePressEvent()或mouseMoveEvent()中,您可以从事件中获取来源的控件指针。例如:
    voidCustomItem::mousePressEvent(QGraphicsSceneMouseEvent *event)    {            QMimeData*data = new QMimeData;            data->setColor(Qt::green);            QDrag*drag = new QDrag(event->widget());            drag->setMimeData(data);            drag->start();    }
要拦截场景的拖放事件,您需要在QGraphicsItem子类中重新实现QGraphicsScene:: dragEnterEvent()和您的特定场景需要的任何事件处理程序。在QGraphicsScene的每个事件处理程序的文档中,您可以阅读有关拖放图形视图的更多信息。项目可以通过调用QGraphicsItem:: setAcceptDrops()启用拖放支持。要处理传入的拖动,重新实现QGraphicsItem :: dragEnterEvent(),QGraphicsItem ::dragMoveEvent(),QGraphicsItem :: dragLeaveEvent()和QGraphicsItem ::dropEvent()。另请参见Drag and Drop Robot示例,用于演示图形视图对拖放操作的支持。

Cursors and Tooltips 光标和工具提示

像Qwidget一样,QGraphicsItem也支持光标(QGraphicsItem:: setCursor())和工具提示(QGraphicsItem :: setToolTip())。 当鼠标光标进入项目的区域时(通过调用QGraphicsItem:: contains()检测),光标和工具提示被QGraphicsView激活。您还可以通过调用QGraphicsView:: setCursor()直接在视图上设置默认光标。有关实现工具提示和游标形状处理的代码,请参阅Drag and Drop Robot示例。

Animation 动画

图形视图支持几个级别的动画。 您可以使用动画框架轻松组装动画。 为此,你需要你的项目继承QGraphicsObject和QPropertyAnimation与他们相关联。QPropertyAnimation允许动画任何QObject属性。另一个选项是创建一个自定义项继承自QObject和QGraphicsItem。 该项可以设置自己的计时器,并使用QObject:: timerEvent()中的增量步骤控制动画。第三个选项,大部分可用于与Qt 3中的QCanvas兼容,是通过调用QGraphicsScene:: advance()推进场景,这又调用QGraphicsItem :: advance()。

OpenGL渲染

要启用OpenGL渲染,您只需通过调用QGraphicsView:: setViewport()设置一个新的QGLWidget作为QGraphicsView的视口。如果你想要带有抗锯齿的OpenGL,你需要OpenGL样本缓冲区支持(见QGLFormat :: sampleBuffers())。例:
    QGraphicsViewview(&scene);    view.setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));

Item Groups 项目组

通过使项目是另一个的子项,您可以实现项目分组的最基本的特征:项目将一起移动,并且所有变换从父项传播到子项。此外,QGraphicsItemGroup是一个特殊的项目,它结合子事件处理与一个有用的接口来添加和删除项目到组和从组。将项目添加到QGraphicsItemGroup将保持项目的原始位置和转换,而reparenting项目一般会导致子项重新定位本身到新的父项。为了方便起见,您可以通过调用QGraphicsScene :: createItemGroup()来创建QGraphicsItemGroups。

Widgets and Layouts 窗口小部件和布局

Qt 4.4通过QGraphicsWidget引入了对几何和布局感知项目的支持。 这个特殊的基础项目类似于QWidget,但不像QWidget,它不继承从QPaintDevice;而是从QGraphicsItem。这允许您编写具有事件,信号和插槽,大小提示和策略的完整小部件,并且还可以通过QGraphicsLinearLayout和QGraphicsGridLayout来管理布局中的小部件几何。

QGraphicsWidget

QGraphicsWidget基于QGraphicsItem的功能和精简的脚本,提供了两个世界的最佳:QWidget的额外功能,如风格,字体,调色板,布局方向,其几何,以及分辨率独立性和从QGraphicsItem的转换支持。因为图形视图使用真实坐标而不是整数,QGraphicsWidget的几何函数也操作QRectF和QPointF。这也适用于框架矩形,边距和间距。使用QGraphicsWidget,例如,指定(0.5,0.5,0.5,0.5)的内容边距并不罕见。您可以创建子窗口小部件和“顶级”窗口; 在某些情况下,您现在可以使用Graphics View进行高级MDI应用程序。支持一些QWidget的属性,包括窗口标志和属性,但不是全部。 你应该参考QGraphicsWidget的类文档,以了解什么是什么和什么是不支持的完整概述。 例如,您可以通过将Qt:: Window窗口标志传递给QGraphicsWidget的构造函数来创建装饰窗口,但Graphics View目前不支持在OS X上常见的Qt :: Sheet和Qt :: Drawer标志。

QGraphicsLayout

QGraphicsLayout是专为QGraphicsWidget设计的第二代布局框架的一部分。 它的API非常类似于QLayout。 你可以在QGraphicsLinearLayout和QGraphicsGridLayout内部管理小部件和子层。 你也可以通过子类化QGraphicsLayout自己编写自己的布局,或者通过编写QGraphicsLayoutItem的适配器子类来添加自己的QGraphicsItem项到布局。

嵌入式小部件支持

图形视图提供了无缝支持将任何小部件嵌入到场景中。 您可以嵌入简单的小部件,如QLineEdit或QPushButton,复杂的小部件,如QTabWidget,甚至完整的主窗口。 要将窗口小部件嵌入场景,只需调用QGraphicsScene :: addWidget(),或创建一个QGraphicsProxyWidget的实例来手动嵌入窗口小部件。通过QGraphicsProxyWidget,图形视图能够深入集成客户端小部件的功能,包括其光标,工具提示,鼠标,平板电脑和键盘事件,子部件,动画,弹出窗口(例如,QComboBox或QCompleter),以及小部件的输入焦点和激活。 QGraphicsProxyWidget甚至集成嵌入式小部件的选项卡顺序,以便您可以进入和离开嵌入式小部件。你甚至可以在你的场景中嵌入一个新的QGraphicsView来提供复杂的嵌套场景。当转换嵌入的小部件时,图形视图确保小部件独立地转换分辨率,允许字体和样式在放大时保持清晰。(请注意,分辨率独立性的效果取决于样式)。

Performance 性能

浮点指令

为了准确快速地将变换和效果应用于项目,图形视图是建立在假设用户的硬件能够为浮点指令提供合理的性能。许多工作站和台式计算机配备有合适的硬件以加速这种计算,但是一些嵌入式设备可以仅提供用于处理数学运算或者仿真软件中的浮点指令的库。    因此,某些类型的效果可能比某些设备上的预期慢。 可以通过在其他领域进行优化来补偿这种性能损失; 例如,通过使用OpenGL来渲染场景。然而,任何这样的优化本身可能导致性能的降低,如果它们还依赖于浮点硬件的存在。
0 0
原创粉丝点击