图形视图、动画和状态机框架

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《QtCreator快速入门》第3版第11章图形视图、动画和状态机框架高级的图形和动画应用框架图形视图框架(GraphicsViewFramework)动画框架(AnimationFramework)状态机框架(StateMachineFramework)11.1图形视图框架的结构11.2坐标系统和事件处理11.3图形视图框架的其他特性11.4动画框架11.5状态机框架主要内容11.1图形视图框架的结构基本绘图绘图完成后,无法控制图形元素。图形视图框架绘图完成后,可以控制图形项的移动、检测它们的碰撞和叠加等。比喻:基本绘图像在纸上画画,画完后很难更改。图形视图框架像在板子上放拼图,不满意可以随时更改。图形视图框架主要包含三部分:图形项(QGraphicsItem):是基本的绘图单元。图形视图框架为经典的形状提供了标准的图形项,如矩形(QGraphicsRectItem)、椭圆(QGraphicsEllipseItem)、文本项(QGraphicsTextItem)等。(世界的组成元素)场景(QGraphicsScene):是放置图形项对象的容器。可以调用addItem()函数向场景中添加图形项,场景对图形项进行管理。(真实世界)视图(QGraphicsView):用来使场景中的内容可视化。每个视图提供一个视口。对于同一个场景,可以使用不同的视图对象实现不同的可视化效果。(不同的人、动物、甚至事物看到的世界)QGraphicsRectItem:提供一个矩形itemQGraphicsEllipseItem:提供一个椭圆itemQGraphicsPolygonItem:提供一个多边形itemQGraphicsLineItem:提供一条线的itemQGraphicsPathItem:提供一个任意的路径itemQGraphicsSimpleTextItem:提供一个文字图标itemQGraphicsTextItem:提供一个文本浏览itemQGraphicsPixmapItem:提供一个图形item标准图形项相关函数scene.addItem(item):向场景中添加已有的图形项scene.addRect():新建标准图形项(矩形),并添加到场景中。scene.itemAt(QPoint):返回指定位置处最顶层可视的图形项。scene.items():返回满足特定条件的所有图形项。view.setForegroundBrush():设置视图的前景颜色。view.setBackgroundBrush():设置视图的背景颜色。view.scale()、rotate()等:对视图进行仿射变换。QGraphicItemGroup:一个图形项组可以包含多个图形项,一个图形项组在场景中可以当作一个图形项使用。自定义图形项若需要使用标准图形项之外的图形,可以自定义图形项。步骤:①子类化QGraphicsItem类;classMyItem:publicQGraphicsItem{}②重新实现边界矩阵函数boundingRect();③重新实现绘制函数paint()。11.2.1坐标系统边界矩形(boundingrectangle)图形项、场景、视图都在各自的一个矩形框中。坐标原点(默认)图形项坐标:在其边界矩形的中心。场景坐标:在其边界矩形的中心。视图坐标:在其边界矩形的左上角。坐标轴x轴从左到右;y轴由上到下;z轴由内而外(图形项的z值越大,在场景中越靠上)。相关函数item.setPos():设置图形项在场景中的位置。item.pos():返回图形项在场景(父对象)中的位置。item.setZValue():设置图形项的Z值,Z值越大越靠上。坐标映射函数11.2.2事件处理与传播事件的传播视图(QEvent)→场景(QGraphicsSceneEvent)→图形项事件在从视图到场景的传递过程中进行了类型转换。图形视图事件的类型QEventQGraphicsSceneEventQGraphicsSceneDragDropEventQGraphicsSceneMouseEventQGraphicsSceneHoverEventQGraphicsSceneContextMenuEventQGraphicsSceneWheelEventQGraphicsSceneResizeEventQGraphicsSceneMoveEvent图形项接收的事件类型键盘事件:默认地,图形项不接收键盘事件;使用item.setFocus()或scene.setFocusItem(item)使图形项item获得焦点,这样item就可以接收键盘事件。鼠标悬停事件:默认地,图形项不接收鼠标悬停事件;使用item.setAcceptHoverEvents()使图形项接收鼠标悬停事件。鼠标事件:默认地,图形项接收鼠标事件。11.3.1图形效果图形效果(QGraphicsEffect)通过在源对象(如一个图形项)和目标设备(如视图的视口)之间挂接渲染管道和一些操作来实现改变元素外观的效果。使用item.setGraphicsEffect(effect)函数在item上实现effect效果。标准图形效果类QObjectQGraphicsEffectQGraphicsBlurEffect:模糊效果QGraphicsColorizeEffect:着色效果QGraphicsDropShadowEffect:阴影效果QGraphicsOpacityEffect:半透明效果原图模糊半透明着色阴影11.3.2动画、碰撞检测和图形项组动画的实现方法一:使用动画框架(AnimationFramework)自定义的MyItem类需要继承自QGraphicsObject类,然后使用QPropertyAnimation类来实现属性渐变动画。方法二:重新实现函数timerEvent()自定义的MyItem类继承自QObject和QGraphicsItem类,这样item就可以安装计时器,并在timerEvent()中实现累积动画。方法三:重新实现advance()函数——此处介绍的方法周期性地调用Scene的advance()函数,它会进而周期性地调用item的advance()函数。QGraphicsScene::advance()场景类QGraphicsScene的槽函数,通过调用场景中图形项的QGraphicsItem::advance()函数,将场景推进一步。推进过程分为两个阶段:第一阶段:告知所有图形项,场景将要变化。传递phase==0给图形项第二阶段:告知所有图形项,它们可以移动了。传递phase==1给图形项触发方式:QObject::connect(&timer,SIGNAL(timeout()),&scene,SLOT(advance()));QGraphicsItem::advance()图形项类QGraphicsItem的虚函数,对于场景中所有图形项来说,该函数被场景的槽函数调用两次。默认该函数什么也不做;若需要动画效果则需重构该函数。碰撞检测方法一:先重新实现QGraphicsItem类的shape()函数返回图形项的准确形状,然后使用collidesWithItem()函数判断两个图形项形状之间是否有交集。shape与boundingRect的区别:对于矩形来说,二者相同;对于其他图形来说,shape的区域小于boundingRect。方法二:直接重新实现QGraphicsItem类的collidesWithItem()函数,来提供一个自定义的图形项碰撞算法。几个函数item.collidesWithPath(path,mode):判断item是否与path碰撞。item.collidesWithItem(item2,mode):判断item是否与item2碰撞。item.collidingItems(mode):获取与item碰撞的所有图形项的列表,返回类型为QListQGraphicsItem*。mode——Qt::ItemSelectionModeQt::ContainsItemShape:“形状”完全包含在选定区域内的图形项Qt::IntersectsItemShape:“形状”包含在内或者与选定区域的边界相交的图形项。Qt::ContainsItemBoundingRect:“边界矩形”完全包含在选定区域内的图形项。Qt::IntersectsItemBoundingRect:“边界矩形”包含在内或者与选定区域的边界相交的图形项。11.3.4图形窗口部件QGraphicsWidget与QWidget类似的图形部件。支持事件、信号与槽、尺寸提示和策略的部件。其对象既拥有窗口部件的特性,又拥有图形项的特性。继承关系QGraphicsWidgetQGraphicsObjectQGraphicsLayoutItemQObjectQGraphicsItem部件转换向场景中添加普通部件,会生成一个对应的图形部件。QTextEdit*edit=newQTextEdit;QGraphicsWidget*textEdit=scene.addWidget(edit);图形部件可以进行坐标变换QGraphicsWidget*form=newQGraphicsWidget;form-shear(2,-0.5);动画框架AnimationFramework11.4动画框架动画框架提供一种“创建具有平滑动画效果的GUI界面”的方法。该框架通过控制Qt中对象的属性来实现动画。应用场景:窗口部件、QObject对象、图形视图框架等。继承关系QVariantAnimation支持的属性数据类型Int、Double、FloatQLine、QLineF、QPoint、QPointFQSize、QSizeF、QRect、QRectFQColor例子QPropertyAnimationanimation(&button,geometry);animation.setDuration(10000);animation.setKeyValueAt(0,QRect(0,0,100,30));animation.setKeyValueAt(0.8,QRect(250,250,100,30));animation.setKeyValueAt(1,QRect(400,250,100,60));animation.start();QPropertyAnimation类使用缓和曲线对属性进行插值,从而实现动画效果。缓和曲线:对象属性随时间t的变化速度函数,默认是线性变化。Qt还定义了十几种类型的变化函数。每一种函数,又有In、Out、InOut和OutIn四种变化规律。相关函数anim.setDuration(t):设置动画的持续时间。anim.setStartValue(p0):设置动画开始时属性的值。anim.setEndValue(p1):设置动画结束时属性的值。anim.setKeyValueAt(a,pa):设置动画中间处属性的值。anim.setEasingCurve():设置动画使用的缓和曲线。anim.start():开始运行动画。动画组QSequentialAnimationGroup:顺序动画组QParallelAnimationGroup:平行动画组group.addAnimation(anim):向动画组中添加动画11.5状态机框架状态机框架提供了一些类来创建和执行状态图(状态转移图)。状态图是一个用来表现“系统对外界激励进行反应”的图形化模型。一个简单的状态机向状态机mach

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功