《图形视图动画和状态机框架ppt课件.ppt》由会员分享,可在线阅读,更多相关《图形视图动画和状态机框架ppt课件.ppt(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用Qt Creator快速入门快速入门第第3版版第第11章章图形视图、动画和状态机框架图形视图、动画和状态机框架经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n高级的高级的图形和动画图形和动画应用框架应用框架q图形视图框架图形视图框架(Graphics View FrameworkGraphics View Framework)q动画框架动画框架(Animation Framework
2、Animation Framework)q状态机框架状态机框架(State Machine FrameworkState Machine Framework)经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n11.1图形视图框架的结构图形视图框架的结构n11.2坐标系统和事件处理坐标系统和事件处理n11.3图形视图框架的其他特性图形视图框架的其他特性n11.4动画框架动画框架n11.5状态机框架状态机框架主主 要要 内内 容容经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的
3、金额为消费者购买商品的价款或接受服务的费用11.1 图形视图框架的结构图形视图框架的结构n基本绘图基本绘图q绘图完成后,无法控制图形元素。绘图完成后,无法控制图形元素。n图形视图框架图形视图框架q绘图完成后,可以控制图形项的移动、检测它们的碰撞和绘图完成后,可以控制图形项的移动、检测它们的碰撞和叠加等。叠加等。n比喻:比喻:q基本绘图像基本绘图像在纸上画画在纸上画画,画完后很难更改。,画完后很难更改。q图形视图框架像图形视图框架像在板子上放拼图在板子上放拼图,不满意可以随时更改。,不满意可以随时更改。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为
4、消费者购买商品的价款或接受服务的费用n图形视图框架主要包含三部分:图形视图框架主要包含三部分:q图形项(图形项(QGraphicsItemQGraphicsItem):是基本的绘图单元。):是基本的绘图单元。n图形视图框架为经典的形状提供了标准的图形项,如矩形图形视图框架为经典的形状提供了标准的图形项,如矩形(QGraphicsRectItem)、椭圆、椭圆(QGraphicsEllipseItem)、文本项、文本项(QGraphicsTextItem)等。等。(世界的组成元素世界的组成元素)q场景(场景(QGraphicsScene QGraphicsScene):是放置图形项对象的容器。)
5、:是放置图形项对象的容器。n可以调用可以调用addItem()函数向场景中添加图形项,场景对图形项进行函数向场景中添加图形项,场景对图形项进行管理。管理。(真实世界真实世界)q视图(视图(QGraphicsViewQGraphicsView):用来使场景中的内容可视化。):用来使场景中的内容可视化。n每个视图提供一个视口。对于同一个场景,可以使用不同的视图每个视图提供一个视口。对于同一个场景,可以使用不同的视图对象实现不同的可视化效果。对象实现不同的可视化效果。(不同的人、动物、甚至事物看到不同的人、动物、甚至事物看到的世界的世界)经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔
6、偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用nQGraphicsRectItem:提供一个矩形提供一个矩形itemnQGraphicsEllipseItem:提供一个椭圆提供一个椭圆itemnQGraphicsPolygonItem:提供一个多边形提供一个多边形itemnQGraphicsLineItem:提供一条线的提供一条线的itemnQGraphicsPathItem:提供一个任意的路径提供一个任意的路径itemnQGraphicsSimpleTextItem:提供一个文字图标提供一个文字图标itemnQGraphicsTextItem:提供一个文本浏览提供一个文
7、本浏览itemnQGraphicsPixmapItem:提供一个图形提供一个图形item标标准准图图形形项项经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n相关函数相关函数qscene.addItem(item)scene.addItem(item):向场景中添加已有的图形项向场景中添加已有的图形项qscene.addscene.addRectRect()():新建标准图形项新建标准图形项(矩形矩形),并添加到场景中。,并添加到场景中。qscene.itemAt(QPoint)scene.itemAt(QPoi
8、nt):返回指定位置处最顶层可视的图形项。返回指定位置处最顶层可视的图形项。qscene.items()scene.items():返回满足特定条件的所有图形项。返回满足特定条件的所有图形项。qview.setForegroundBrush()view.setForegroundBrush():设置视图的前景颜色。设置视图的前景颜色。qview.setBackgroundBrush()view.setBackgroundBrush():设置视图的背景颜色。设置视图的背景颜色。qview.scale()view.scale()、rotate()rotate()等:等:对视图进行仿射变换。对视图进
9、行仿射变换。qQGraphicItemGroupQGraphicItemGroup:一个图形项组可以包含多个图形项,一个:一个图形项组可以包含多个图形项,一个图形项组在场景中可以当作一个图形项使用。图形项组在场景中可以当作一个图形项使用。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n自定义图形项自定义图形项q若需要使用标准图形项之外的图形,可以自定义图形项。若需要使用标准图形项之外的图形,可以自定义图形项。q步骤:步骤:n子类化子类化QGraphicsItem类;类;qclass MyItem:public
10、QGraphicsItem n重新实现边界矩阵函数重新实现边界矩阵函数boundingRect();n重新实现绘制函数重新实现绘制函数paint()。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用11.2.1 坐标系统坐标系统n边界矩形(边界矩形(boundingrectangle)q图形项、场景、视图都在各自的一个矩形框中。图形项、场景、视图都在各自的一个矩形框中。n坐标原点(默认)坐标原点(默认)q图形项坐标:图形项坐标:在其边界矩形的中心。在其边界矩形的中心。q场景坐标:场景坐标:在其边界矩形的中心。在其
11、边界矩形的中心。q视图坐标:视图坐标:在其边界矩形的左上角。在其边界矩形的左上角。n坐标轴坐标轴qx x轴从左到右;轴从左到右;qy y轴由上到下;轴由上到下;qz z轴由内而外(图形项的轴由内而外(图形项的z z值越大,在场景中越靠上)。值越大,在场景中越靠上)。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n相关函数相关函数qitem.setPos()item.setPos():设置图形项在场景中的位置。:设置图形项在场景中的位置。qitem.pos()item.pos():返回图形项在场景(父对象)中的位
12、置。:返回图形项在场景(父对象)中的位置。qitem.setZValue()item.setZValue():设置图形项的:设置图形项的Z Z值,值,Z Z值越大越靠上。值越大越靠上。n坐标映射函数坐标映射函数经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用11.2.2 事件处理与传播事件处理与传播n事件的传播事件的传播q视图视图(QEvent)(QEvent)场景场景(QGraphicsSceneEvent)(QGraphicsSceneEvent)图形项图形项q事件在从视图到场景的传递过程中进行了事件在从视图
13、到场景的传递过程中进行了类型转换类型转换。n图形视图事件的类型图形视图事件的类型QEventQGraphicsSceneEventQGraphicsSceneDragDropEventQGraphicsSceneMouseEventQGraphicsSceneHoverEventQGraphicsSceneContextMenuEventQGraphicsSceneWheelEventQGraphicsSceneResizeEventQGraphicsSceneMoveEvent经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或
14、接受服务的费用n图形项接收的事件类型图形项接收的事件类型q键盘事件:键盘事件:n默认地,图形项不接收键盘事件;默认地,图形项不接收键盘事件;n使用使用item.setFocus()或或scene.setFocusItem(item)使图形项使图形项item获得焦点,这样获得焦点,这样item就可以接收键盘事件。就可以接收键盘事件。q鼠标悬停事件:鼠标悬停事件:n默认地,图形项不接收鼠标悬停事件;默认地,图形项不接收鼠标悬停事件;n使用使用item.setAcceptHoverEvents()使图形项接收鼠标悬停事使图形项接收鼠标悬停事件。件。q鼠标事件:鼠标事件:n默认地,图形项接收鼠标事件。
15、默认地,图形项接收鼠标事件。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用11.3.1 图形效果图形效果n图形效果(图形效果(QGraphicsEffect)q通过在源对象(如一个图形项)和目标设备(如视图的通过在源对象(如一个图形项)和目标设备(如视图的视口)之间挂接渲染管道和一些操作来实现改变元素外视口)之间挂接渲染管道和一些操作来实现改变元素外观的效果。观的效果。q使用使用item.item.setGraphicsEffectsetGraphicsEffect(effect)(effect)函数在函数在i
16、temitem上实上实现现effecteffect效果。效果。n标准图形效果类标准图形效果类QObjectQGraphicsEffectQGraphicsBlurEffect:模糊效果:模糊效果QGraphicsColorizeEffect:着色效果:着色效果QGraphicsDropShadowEffect:阴影效果:阴影效果QGraphicsOpacityEffect:半透明效果:半透明效果经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用原图原图模糊模糊半透明半透明着色着色阴影阴影经营者提供商品或者服务有欺诈
17、行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用11.3.2 动画、碰撞检测和图形项组动画、碰撞检测和图形项组n动画的实现动画的实现q方法一:使用动画框架方法一:使用动画框架(Animation FrameworkAnimation Framework)n自定义的自定义的MyItem类需要继承自类需要继承自QGraphicsObject类,然后使类,然后使用用QPropertyAnimation类来实现类来实现属性渐变动画属性渐变动画。q方法二:重新实现函数方法二:重新实现函数timerEvent()timerEvent()n自定义的自定义
18、的MyItem类继承自类继承自QObject和和QGraphicsItem类,这样类,这样item就可以安装计时器,并在就可以安装计时器,并在timerEvent()中实现中实现累积动画累积动画。q方法三:重新实现方法三:重新实现advance()advance()函数函数此处介绍的方法此处介绍的方法n周期性地调用周期性地调用Scene的的advance()函数,它会进而周期性地调用函数,它会进而周期性地调用item的的advance()函数。函数。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用nQGraphi
19、csScene:advance()q场景类场景类QGraphicsSceneQGraphicsScene的的槽函数槽函数,通过调用场景中图形项的,通过调用场景中图形项的QGraphicsItem:advanceQGraphicsItem:advance()()函数,将场景推进一步。函数,将场景推进一步。q推进过程分为两个阶段推进过程分为两个阶段:n第一阶段:告知所有图形项,场景将要变化。传递第一阶段:告知所有图形项,场景将要变化。传递phase=0给图形项给图形项n第二阶段:告知所有图形项,它们可以移动了。传递第二阶段:告知所有图形项,它们可以移动了。传递phase=1给图形项给图形项q触发方
20、式触发方式:QObject:connect(&timer,SIGNAL(timeout(),QObject:connect(&timer,SIGNAL(timeout(),&scene,SLOT(advance();&scene,SLOT(advance();nQGraphicsItem:advance()q图形项类图形项类QGraphicsItemQGraphicsItem的的虚函数虚函数,对于场景中所有图形项来说,对于场景中所有图形项来说,该函数被场景的槽函数调用两次。该函数被场景的槽函数调用两次。q默认该函数什么也不做;若需要动画效果则需重构该函数。默认该函数什么也不做;若需要动画效果则
21、需重构该函数。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n碰撞检测碰撞检测q方法一:方法一:先重新实现先重新实现QGraphicsItemQGraphicsItem类的类的shape()shape()函数返函数返回图形项的准确形状,然后使用回图形项的准确形状,然后使用collidesWithItem()collidesWithItem()函函数判断两个图形项数判断两个图形项形状之间是否有交集形状之间是否有交集。nshape与与boundingRect的区别:的区别:对于矩形来说,二者相同;对对于矩形来说,二
22、者相同;对于其他图形来说,于其他图形来说,shape的区域小于的区域小于boundingRect。q方法二:方法二:直接重新实现直接重新实现QGraphicsItemQGraphicsItem类的类的collidesWithItemcollidesWithItem()()函数,来提供一个函数,来提供一个自定义的图形项碰撞算法自定义的图形项碰撞算法。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n几个函数几个函数qitem.item.collidesWithPathcollidesWithPath(path,mo
23、de)(path,mode):判断:判断itemitem是否与是否与pathpath碰撞。碰撞。qitem.item.collidesWithItemcollidesWithItem(item2,mode)(item2,mode):判断:判断itemitem是否与是否与item2item2碰撞。碰撞。qitem.item.collidingItemscollidingItems(mode)(mode):获取与:获取与itemitem碰撞的所有图形项的列表,碰撞的所有图形项的列表,返回类型为返回类型为QListQList。nmodeQt:ItemSelectionModeqQt:Contains
24、ItemShapeQt:ContainsItemShape:“形状形状”完全包含在选定区域内的图形项完全包含在选定区域内的图形项qQt:IntersectsItemShapeQt:IntersectsItemShape:“形状形状”包含在内或者与选定区域的边包含在内或者与选定区域的边界相交的图形项。界相交的图形项。qQt:ContainsItemBoundingRectQt:ContainsItemBoundingRect:“边界矩形边界矩形”完全包含在选定区域完全包含在选定区域内的图形项。内的图形项。qQt:IntersectsItemBoundingRectQt:IntersectsIte
25、mBoundingRect:“边界矩形边界矩形”包含在内或者与选包含在内或者与选定区域的边界相交的图形项。定区域的边界相交的图形项。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用11.3.4 图形窗口部件图形窗口部件nQGraphicsWidgetq与与QWidgetQWidget类似的图形部件。类似的图形部件。q支持事件、信号与槽、尺寸提示和策略的部件。支持事件、信号与槽、尺寸提示和策略的部件。q其对象其对象既拥有窗口部件的特性既拥有窗口部件的特性,又拥有图形项的特性又拥有图形项的特性。n继承关系继承关系QG
26、raphicsWidgetQGraphicsObjectQGraphicsLayoutItemQObjectQGraphicsItem经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n部件转换部件转换q向场景中添加普通部件,会生成一个对应的图形部件。向场景中添加普通部件,会生成一个对应的图形部件。nQTextEdit*edit=newQTextEdit;nQGraphicsWidget*textEdit=scene.addWidget(edit);q图形部件可以进行坐标变换图形部件可以进行坐标变换nQGraphi
27、csWidget*form=newQGraphicsWidget;nform-shear(2,-0.5);经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用动画框架动画框架Animation Framework经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用11.4 动画框架动画框架n动画框架动画框架q提供一种提供一种“创建具有平滑动画效果的创建具有平滑动画效果的GUIGUI界面界面”的方法。的方法。q该框架通过控制该框架通过控制Qt
28、Qt中中对象的属性对象的属性来实现动画。来实现动画。q应用场景:窗口部件、应用场景:窗口部件、QObjectQObject对象、图形视图框架等。对象、图形视图框架等。n继承关系继承关系经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用nQVariantAnimation支持的属性数据类型支持的属性数据类型qIntInt、DoubleDouble、FloatFloatqQLineQLine、QLineFQLineF、QPointQPoint、QPointFQPointFqQSizeQSize、QSizeFQSizeF
29、、QRectQRect、QRectFQRectFqQColorQColorn例子例子qQPropertyAnimation QPropertyAnimation animation(&button,geometry);animation(&button,geometry);qanimation.animation.setDurationsetDuration(10000);(10000);qanimation.animation.setKeyValueAtsetKeyValueAt(0,QRect(0,0,100,30);(0,QRect(0,0,100,30);qanimation.setK
30、eyValueAt(0.8,QRect(250,250,100,30);animation.setKeyValueAt(0.8,QRect(250,250,100,30);qanimation.setKeyValueAt(1,QRect(400,250,100,60);animation.setKeyValueAt(1,QRect(400,250,100,60);qanimation.animation.startstart();();经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用nQPropertyAnima
31、tion类使用类使用缓和曲线缓和曲线对属性进行对属性进行插值,从而实现动画效果。插值,从而实现动画效果。q缓和曲线:对象属性随时间缓和曲线:对象属性随时间t t的变化速度函数,默认是线的变化速度函数,默认是线性变化。性变化。QtQt还定义了十几种类型的变化函数。还定义了十几种类型的变化函数。q每一种函数,又有每一种函数,又有InIn、OutOut、InOutInOut和和OutInOutIn四种变化规律。四种变化规律。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n相关函数相关函数qanim.setDurati
32、on(t)anim.setDuration(t):设置动画的持续时间设置动画的持续时间。qanim.setStartValue(p0)anim.setStartValue(p0):设置动画开始时属性的值设置动画开始时属性的值。qanim.setEndValue(p1)anim.setEndValue(p1):设置动画结束时属性的值设置动画结束时属性的值。qanim.setKeyValueAt(a,pa)anim.setKeyValueAt(a,pa):设置动画中间处属性的值设置动画中间处属性的值。qanim.setEasingCurve()anim.setEasingCurve():设置动画使
33、用的缓和曲线设置动画使用的缓和曲线。qanim.start()anim.start():开始运行动画开始运行动画。n动画组动画组qQSequentialAnimationGroupQSequentialAnimationGroup:顺序动画组顺序动画组qQParallelAnimationGroupQParallelAnimationGroup:平行动画组平行动画组qgroup.addAnimation(anim)group.addAnimation(anim):向动画组中添加动画向动画组中添加动画经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消
34、费者购买商品的价款或接受服务的费用11.5 状态机框架状态机框架n状态机框架状态机框架q提供了一些类来创建和执行状态图(状态转移图)。提供了一些类来创建和执行状态图(状态转移图)。q状态图是一个用来表现状态图是一个用来表现“系统对外界激励进行反应系统对外界激励进行反应”的的图形化模型。图形化模型。n一个简单的状态机一个简单的状态机经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n向状态机向状态机machine中添加状态:中添加状态:q以状态机为参数以状态机为参数:QState s1=new QState(&mac
35、hine)QState s1=new QState(&machine)q使用使用addState()addState()函数函数:machine.addState(s1)machine.addState(s1)n设置设置“在状态在状态s1下下”部件的属性值部件的属性值qs1-assignProperty(s1-assignProperty(部件,属性名,属性值部件,属性名,属性值)n例:例:s1-assignProperty(&button,“geometry”,QRect(0,0,100,100)n设置状态间的转移关系设置状态间的转移关系qs1-s1-addTransitionaddTran
36、sition(&button,SIGNAL(clicked(),s2)(&button,SIGNAL(clicked(),s2)n转移关系:从转移关系:从s1转移到转移到s2。n转移条件:当转移条件:当button发射发射clicked()信号时。信号时。n设置初始状态设置初始状态qsetInitialState(s1)setInitialState(s1):将状态:将状态s1s1设置为初始状态。设置为初始状态。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用n与状态相关的信号与状态相关的信号q进入状态进入状态s
37、1s1时,时,s1s1会发射一个会发射一个entered()entered()信号信号。q离开状态离开状态s1s1时,时,s1s1会发射一个会发射一个exited()exited()信号信号。q若若s1s1是是QFinalStateQFinalState的对象,进入的对象,进入s1s1时会发射一个时会发射一个finishedfinished()()信号信号。n可以利用这些信号做一些事情,如:可以利用这些信号做一些事情,如:qconnect(s3,SIGNAL(connect(s3,SIGNAL(entered()entered(),button,),button,SLOT(SLOT(showM
38、aximized()showMaximized(););qconnect(s3,connect(s3,SIGNAL(exited()SIGNAL(exited(),button,),button,SLOT(SLOT(showMinimized()showMinimized(););经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用在状态机中使用动画在状态机中使用动画n所有状态都使用所有状态都使用默认动画默认动画转移转移qmachine.machine.addDefaultAnimationaddDefaultAni
39、mation(animation);(animation);n为不同状态定制为不同状态定制专属动画专属动画转移转移qtransition1-addAnimation(animation1)transition1-addAnimation(animation1);qtransition2-addAnimation(animation2)transition2-addAnimation(animation2);n注意:注意:q此处无需指定此处无需指定animationanimation的开始值和结束值,它们隐含的开始值和结束值,它们隐含在切换所连接的两个状态中。在切换所连接的两个状态中。经营者提供
40、商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用多个状态共享切换多个状态共享切换n“在任何状态下点击在任何状态下点击quitButton都退出都退出”的实现方法:的实现方法:q分别切换:分别切换:分别从分别从s11s11、s12s12、s13s13到状态到状态s2s2添加切换:添加切换:太繁琐太繁琐q共享切换共享切换:将:将s11s11、s12s12、s13s13聚合为一个新状态聚合为一个新状态s1s1,然后添加,然后添加s1s1到到s2s2的切换,即可实现三个子状态共享切换的效果。的切换,即可实现三个子状态共享切换的效果
41、。qQState*s11=newQState(s1);qQState*s12=newQState(s1);qQState*s13=newQState(s1);qs1-setInitialState(s11);qmachine.addState(s1);qmachine.addState(s2);qs1-addTransition(quitButton,SIGNAL(clicked(),s2);经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用被中断状态的保存与恢复被中断状态的保存与恢复nQHistoryStateq
42、s1s1被中断后切换到被中断后切换到s3s3,若希望,若希望s3s3执行后可以恢复到执行后可以恢复到s1s1被中断时的子被中断时的子状态,可以使用状态,可以使用历史状态历史状态来存储被中断时来存储被中断时s1s1所处的子状态。所处的子状态。qQHistoryStateQHistoryState是一个伪状态,用来存储父状态退出时的子状态。是一个伪状态,用来存储父状态退出时的子状态。qQHistoryState*s1h=newQHistoryState(s1);qs3-addTransition(s1h);qmachine.addState(s3);qs1-addTransition(interr
43、uptButton,SIGNAL(clicked(),s3);经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用平行状态组平行状态组避免组合爆炸避免组合爆炸n组合爆炸:组合爆炸:q若每个状态由若每个状态由n n个属性组成(每个属性有个属性组成(每个属性有两个互斥的取值),则共有两个互斥的取值),则共有2n2n个状态,个状态,状态个数随着状态个数随着n n指数增长。指数增长。n平行状态组平行状态组:每个属性一个子状态:每个属性一个子状态qQState*s1=newQState(QState:ParallelState
44、s);qQState*s11=newQState(s1);qQState*s12=newQState(s1);n进入和退出进入和退出平行状态组平行状态组q当进入一个平行状态组时,相当于同时当进入一个平行状态组时,相当于同时进入了它的所有子状态。进入了它的所有子状态。q当一个子状态退出时,其他所有子状态当一个子状态退出时,其他所有子状态都会退出。都会退出。经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用无目标切换无目标切换n使用重载形式使用重载形式s1-addTransition(trans)进行无目标切换。进行无
45、目标切换。相当于到自身的切换,即先退出相当于到自身的切换,即先退出s1,再进入,再进入s1。qtranstrans会发出会发出triggered()triggered()信号。信号。qs1s1会发出会发出exited()exited()和和entered()entered()信号。信号。n利用这些信号可以进行一些处理。利用这些信号可以进行一些处理。qQSignalTransition*trans=new QSignalTransition(&button,QSignalTransition*trans=new QSignalTransition(&button,SIGNAL(clicked();SIGNAL(clicked();qs1-addTransition(trans);s1-addTransition(trans);qQObject:connect(trans,SIGNAL(triggered(),&msgBox,QObject:connect(trans,SIGNAL(triggered(),&msgBox,SLOT(exec();SLOT(exec();经营者提供商品或者服务有欺诈行为的,应当按照消费者的要求增加赔偿其受到的损失,增加赔偿的金额为消费者购买商品的价款或接受服务的费用The End!