图形视图体系结构

 1. Graphics  View的特点

         Graphics View框架结构的主要特点如下

  1. Graphics View框架结构中,系统可以利用αt绘图系统的反锯齿、 OpenGL工具来改善绘图性能。

  2. Graphics View支持事件传播体系结构,可以使图元在场景( scene)中的交互能力提高一倍,图元能够处理键盘事件和鼠标事件。其中,鼠标事件包括鼠标按下、移动、释放和双击,还可以跟踪鼠标的移动。

  3. 在 Graphics View框架中,通过二元空间划分树( Binary SpacePartitioning,BSP)提供快速的图元查找,这样就能够实时地显示包含上百万个图元的大场景。

 2. Graphics  View的三元素

Graphics View框架结构主要包含三个类,场景类(QGraphicsScene)、视图类( GRaphics View)和图元类( QGraphicsltem),统称为“三元素”。其中,场景类提供了一个用于管理位于其中的众多图元容器,视图类用于显示场景中的图元,一个场景可以通过多个视图表现,一个场景包括多个几何图形。它们三者之间的关系如图所示。

(1)场景类: QGraphicsScene类

它是一个用于放置图元的容器,本身是不可见的,必须通过与之相连的视图类来显示及与外界进行互操作。通过 QGraphicsScene: addItemO可以添加一个图元到场景中。图元可以通过多个函数进行检索。 QGraphicsScene: items和一些重载函数可以返回和点、矩形、多边形或向量路径相交的所有图元。 QGraphics Scene: sitemap()返回指定点的最顶层图元。

场景类主要完成的工作包括,提供对它包含的图元的操作接口和传递事件,管理各个图元的状态(如选择和焦点处理),提供无变换的绘制功能(如打印)等。

事件传播体系结构将场景事件发送给图元,同时也管理图元之间的事件传播。如果场景接收到了在某一点的鼠标单击事件,场景会将事件传给在这一点的图元。

管理各个图元的状态(如选择和焦点处理)。可以通过QGraphicsScene: setSelection Areao函数选择图元,选择区域可以是任意的形状,使用 QPainterPath表示。若要得到当前选择的图元列表,则可以使用函数QGraphics Scene: Selectedltemso。可以通过 QGraphicsScene: setFocusltemo函数或GRaphics Scene: setFocuso函数来设置图元的焦点,获得当前具有焦点的图元使用函数 QGraphicsScene: focusltem()。

如果需要将场景内容绘制到特定的绘图设备,则可以使用QGraphicsScene: render函数在绘图设备上绘制场景。

(2)视图类: QGraphics View类

它提供一个可视的窗口,用于显示场景中的图元。在同一个场景中可以有多个视图,也可以为相同的数据集提供几种不同的视图。

QGraphics View是可滚动的窗口部件,可以提供滚动条来浏览大的场景。如果需要使用 OpengL,则可以使用 QGraphics view: set viewport将视图设置为QGLWidget

视图接收键盘和鼠标的输入事件,并将它们翻译为场景事件(将座标转换为场景的座标)。使用变换矩阵函数 QGraphics View: matrix可以变换场景的座标,实现场景缩放和旋转。 GRaphics View提供 QGraphics View: map ToSceneo和GRaphics View: map FromSceneo用于与场景的座标进行转换。

(3)图元类: QGraphicsItem类

它是场景中各个图元的基类,在它的基础上可以继承出各种图元类,Qt已经预置的包括直线( QGraphicsLineltem)、椭圆( QGraphicsEllipseltem)、文本图元( QGraphics Textitem)、矩形( QGraphicsRectitem)等。当然,也可以在 QGraphicsltem类的基础上实现自定义的图元类,即用户可以继承QGraphicsItem实现符合自己需要的图元。

  QgraphicsItem主要有以下几点功能:

●处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件。

●处理键盘输入事件。

●处理拖曳事件

●分组。

●碰撞检测

此外,图元有自己的座标系统,也提供场景和图元。图元还可以通过QGraphicsltem: matrix来进行自身的交换,可以包含子图元。

 3. Graphics  View的座标系统

Graphics View左边基于笛卡尔座标系,一个图元的场景具有X座标和Y座标。当使用没有变换的视图观察场景时,场景中的一个单元对应屏幕上的一个像素。

三个 Graphics View基本类有各自不同的座标系,场景座标、视图座标和图元座标。 Graphics View提供了三个座标系统之间的转换函数。在绘制图形时,Graphics View的场景座标对应 QPainter的逻辑座标、视图座标和设备座标。

1.场景座标

场景座标是所有图元的基础座标系统。场景座标系统描述了顶层的图元,每个图元都有场景座标和相应的包容框。场景座标的原点在场景中心,座标原点是X轴正方向向右,Y轴正方向向下。

       QGraphicsScene类的座标系以中心为原点(0,0),如图所示。

 

       2.  视图座标

视图座标是窗口部件的座标。视图座标的单位是像素。 GRaphics View视图的左上角是(0,0),X轴正方向向右,Y轴正方向向下。所有的鼠标事件最开始都是使用视图座标。

 

QGraphics View类继承自 Q Widget类,因此它与其他的 QWidget类一样,以窗口的左上角作为自己座标系的原点,如图73所示。

 

       3.图元座标

图元使用自己的本地座标,这个座标系统通常以图元中心为原点,这也是所有变换的原点。图元座标方向是X轴正方向向右,Y轴正方向向下。创建图元后,只需要注意图元座标就可以了,QGraphicsScene 和QgraphicsView会完成所有的变换。

QGraphicsItem类的座标系,若再调用QGraphicsItem类的paint()函数重绘图元时,则以此座标系未基准。如图所示。

 

根据需要,Qt提供了这三个座标系之间的互相转换函数,以及图元与图元之间的转换函数,若需从 QGraphicslten座标系中的某一点座标转换到场景中的座标,则可调用 QGraphicsltem的 map ToSceneo函数进行映射。而 QGraphicsltem的mapToParentO函数则可将 QGraphicsltem座标系中的某点座标映射至它的上一级座标系中,有可能是场景座标,也有可能是另一个 QGraphicsItem座标。

Graphics View框架提供了多种座标变换函数,见表。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章