基于项的图形视图
对于用户自定义窗口部件和绘制二个或者几个项来说,使用QPainter 是理想的。在绘图中,如果需要处理从几个到几万的项时,而且要求用户能够单击、拖动和选取项, Qt 的视图类提供了对这一问题的解决方案。
Qt 的视图体系包括一个由QGrapmcsScene 充当的场景和一些由QGrapmcsltem 的子类充当的场景中的项。场景(以及它的项)在视图中显示,这样用户就可以看到了,它由QGrapmcsView 类充当。同一场景可以在多个视图中显示一一例如,便于部分地显示一个大的场景,或者以不同的变换来显示场景。
上图提供了几个预定义的QGraphicsItem子类,包括QGraphicsLineItem、QGraphicsPixmapItem、QGraphicsSimpleTextItem(应用于纯文本),以及QGraphicsTextItem(应用于多文本)。也可以创建自己的QGraphicsItem子类。
GrapmcsScene 是一个图形项的集合。一个场景有三层:背景层(background layer)、项层(item layer) 和前景层(foreground layer)。背景层和前景层通常由QBrush 指定,但也可能需要重新实现drawBackground()和drawForegtouhd(),以便可以实现完全控制。如果想用一个图片作为背景,可以简单地创建该图片作为QBrush 纹理。前景画刷可以设置成半透明的白色,给足一种褪色的效果,或者设置成交叉模式,提供一种格子覆盖的效果。
场景可以告诉我们哪些项是重叠的,哪些是被选取的,以及哪些是在一个特定的点处,或者在一个特定的区域内。场景中的项或者是最高层的项(场景就是其父对象) ,或者是子项(它们的父对象是另外的项)。任何应用于项的变换都会自动地应用于子对象。
视图体系提供了两种分组项的方法。一种方法是简单地使一个项成为另一个项的子项。另外一种方法是使用QGraphicsltemGroup。把一个项添加到组中不会引起任何变换,这些组可以很方便地处理大量的项,就像它们是一个单独项一样。
QGraphicsView是一个窗口部件,这个窗口部件可以显示场景,在需要的情况下提供滚动条,以及影响场景绘制方式的变换能力。这有利于支持缩放和旋转,帮助浏览场景。
默认情况下, QGraþhicsView 使用Qt的内置二维图形引擎绘图,但这可以改变,在其创建完后调用setViewport()改为使用OpenGL 窗口部件。
这个体系使用三种不同的坐标系统一一视口坐标、场景坐标和项坐标一一而且还包含从一个坐标系统映射到另一个坐标的函数。视口坐标是QGraphicsView的坐标。场景坐标是逻辑坐标,用来布置场景中的项。项坐标针对某一项,并且以(0,0) 点为中心。当在场景中移动项时,项坐标保持不变。在实际应用中,我们常常只关心场景坐标(用于布置上层的项),以及项坐标(用于布置子项和绘制项)。依照本身的坐标系统绘制项意味着我们不用去关心项在场景中的位置或者关心需要应用的变换。