Qt提供了图形视图框架(Graphics View Framework)、动画框架(The Animation Framework)和状态机框架(The State Machine Framework)来实现更高级的图形和动画应用。使用这些框架可以快速设计处动态GUI应用程序和各种动画、游戏程序。
图形视图框架的结构
图形视图框架提供了一个基于图形项的模型视图编辑方法,主要由场景、视图和图形项三部分组成,这三部分分别由QGraphicsScene、QGraphicsView和QGraphicsItem这三个类来表示。多个视图可以查看一个场景,场景中包含各种各样的图形项。
图形视图框架可以管理数量庞大的自定义2D图形项,并且可以和他们进行交互。使用视图部件可以使这些图形项可视化,视图还支持缩放和旋转。框架中包含了一个事件传播构架,提供了和场景中的图形项进行精确的双精度交互的能力,图形项可以处理键盘事件,鼠标的按下、移动、释放和双击事件,还可以跟踪鼠标的移动。图形视图框架使用一个BSP(Binary Space Partitioning)树来快速发现图形项,也正是因如此,它可以实时显示一个巨大的场景,甚至包含上百万个图形项。
场景
QGraphicsScene提供了图形视图框架中的场景,场景拥有以下几个功能:1>提供用于管理大量图形项的高速接口;2>传播事件到每一个图形项;3>管理图形项的状态,比如选择和处理焦点;4>提供无变换的渲染功能,主要用于打印。
场景使图形项QGraphicsItem对象的容器。可以调用QGraphicsScene::addItem()函数将图形项添加到场景中,然后调用任意一个图形项发现函数来检索添加的图形项。QGraphicsScene::items()函数及其他重载函数可以返回符合条件的所有图形项,这些图形项不是与指定的点、矩形、多边形或者矢量路径相交,就是包含在它们之中。QGraphicsScene::itemAt()函数返回指定点的最上层的图形项。所有的图形项发现函数返回的图形项都是使用递减顺序。如果要从场景中删除一个图形项,则可以使用QGriphicsScene::RevemoveItem()函数。
QGriphicsScene的事件传播构架可以将场景事件传递给图形项,也可以管理图形项之间事件的传播。QGrophicsScene也用来管理图形项的状态,如图形项的选择和焦点等。可以通过向QGraphicsScene::setSelectionArea()函数传递一个任意的形状来选择场景中指定的图形项。如果要获取当前选取的所有图形项的列表,则可以使用QGraphicsScene::selectedItems()函数。另外可以调用QGraphicsScene::setFocusItem()或者QGraphicsScene::setFocus()函数来为一个图形项设置焦点,调用QGraphicsScene::focusItem()函数获取当前获得焦点的图形项。
QGriphicsScene也可以使用QGraphicsScene::render()函数将场景中的一部分渲染到一个绘图设备上。
视图
QGraphicsView提供了视图部件,它用来使场景中的内容可视化。可以连接多个视图到同一个场景为相同的数据集提供多个视口。视图部件是一个可滚动的区域,它提供了一个滚动条来浏览大的场景。可以使用setDragMode()函数以QGraphicsView::ScrollHandDrag为参数来使光标变为手掌形状,从而可以拖动场景。如果设置setDragMode()的参数为QGraphicsView::RubberBandDrap,那么可以在视图上使用鼠标拖出橡皮筋框来选择图形项。默认的QGraphicsView提供了一个QWidget作为视口部件,如果要使用OpenGL进行渲染,则可以调用QGriphicsView::setViewport()设置QOpenGLWidget作为视口。QGraphicsView会获取视口部件的拥有权。
视图从键盘或者鼠标接收输入事件,然后会在发送这些事件到可视化的场景之前将它们转换为场景事件(将坐标转换为合适的场景坐标)。另外,使用视图的变换矩阵函数QGraphicsView::transform()时,可以通过视图来变换场景的坐标系统,这样便可以实现比如缩放和旋转等高级的导航功能。
图形项
QGraphicsItem时场景中图形项的基类。图形试图框架为典型的形状提供了标准的图形项,比如矩形(QGraphicsRectItem)、椭圆(QGraphicsEllipseItem)和文本项(QGraphicsTextItem)。不过,只有编写自定义的图形项时才能发挥QGriphicsItem的强大功能。QGraphicsItem主要支持如下功能:
>鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单键
>键盘输入焦点和键盘事件
>拖放事件
>分组,使用QGraphicsItemGroup通过parent-child关系实现
>碰撞检测
除此之外,图形项还可以存储自定义的数据,可以使用setData()进行数据存储,然后使用data()获取其中的数据。
图形视图框架的坐标系统和事件处理
坐标系统
图形视图框架基于笛卡尔坐标系统,一个图形项在场景中的位置和几何形状由x和y坐标来表示。当使用一个没有变换的视图来观察场景时,场景中的一个单元代表屏幕上的一个像素。图形视图框架中有三个有效的坐标系统:图形项坐标、场景坐标和视图坐标。为了方便应用,图形视图框架中提供了一些便捷函数来完成3个坐标系统之间的映射。进行绘图时,场景坐标对应QPainter的逻辑坐标,视图坐标对应于设备坐标。
1.图形项坐标
图形项使用自己的本地坐标系统,坐标通常是以它们的中心为原点(0,0),而这也是所有变换的中心。当要创建一个自定义图形项时,只需要考虑图形项的坐标系统,QGraphicsScene和QGraphicsView会完成其他所有的变换。而且,一个图形项的边界矩形和图形形状都是在图形项坐标系统中的。
图形项的位置是指图形项的原点在其父图形项或者憧憬中的位置。如果一个图形项在另一个图形项之中,那么它被称为子图形项,而包含它的图形项称为它的父图形项。所以没有父图形项的图形项都会在场景的坐标系统中,它们被称为顶级图形项。可以使用setPos()函数来指定图形项的位置,如果没有指定,则默认出现在父图形项或者场景的原点处。
子图形项的位置和坐标是相对于父图形项的,虽然父图形项的坐标变换会隐含地变换子图形项,但是子图形项的坐标不会受到父图形项的影响。但是相对于场景,子图形项会跟随父图形项的变换。

最低0.47元/天 解锁文章
3295

被折叠的 条评论
为什么被折叠?



