PyQt动画框架和状态机中的可见属性

时间:2011-09-05 12:14:37

标签: qt animation pyqt visible state-machine

抱歉我的英语不好。

我正在使用带动画的状态机。我想实现淡出/生效。

STATE1: opactiy = 0 visible = False

STATE2: opactiy = 1 visible = True

state1 - >状态2: 将小部件从下向上移动,首先将“visible”属性设置为True,然后设置 “opactiy”在5秒内从0.0到1.0。

state2 - >状态1: 将窗口小部件从上到下移动,其“opactiy”在5秒内从1.0到0.0,然后将窗口小部件的“visible”属性设置为False。

但问题是,当state2到state1时,它总是首先将“visible”属性设置为False,所以我看到的是小部件消失而没有淡出效果,即使我使用QSequentialAnimationGroup并首先设置opactiy_animation。

我如何获得淡出效果?

守则:

self.group_p = QtCore.QParallelAnimationGroup()   
self.group_s = QtCore.QSequentialAnimationGroup()
self.group_sr = QtCore.QSequentialAnimationGroup()

goe = QtGui.QGraphicsOpacityEffect()
self.label_arrow.setGraphicsEffect(goe)
animation_o = QtCore.QPropertyAnimation(goe, "opacity")             
animation_g = QtCore.QPropertyAnimation(self.label_arrow, "geometry")
animation_v = QtCore.QPropertyAnimation(self.label_arrow, "visible")

animation_g.setDuration(5000)
animation_g.setEasingCurve(QEasingCurve.OutBounce)
animation_o.setDuration(5000)

self.group_p.addAnimation(animation_g)
self.group_p.addAnimation(animation_o)                                                                     

self.group_s.addAnimation(self.group_p)
self.group_s.addAnimation(animation_v)

self.group_sr.addAnimation(animation_v)
self.group_sr.addAnimation(self.group_p)

self.machine = QtCore.QStateMachine()
state1 = QState(self.machine)
state2 = QState(self.machine)
self.machine.setInitialState(state1)

state1.assignProperty(self.label_arrow, "geometry", QtCore.QRect(self.label_arrow.x(),\
                        self.label_arrow.y()+100, self.label_arrow.width(), self.label_arrow.height()))
state1.assignProperty(self.label_arrow, "visible", False)
state1.assignProperty(goe, "opacity", 0.5)                                      

state2.assignProperty(self.label_arrow, "geometry", self.label_arrow.geometry())
state2.assignProperty(self.label_arrow, "visible", True)
state2.assignProperty(goe, "opacity", 1)                         

transition = state1.addTransition(self.sig_arrow_animate, state2)
transition.addAnimation(self.group_sr)                            

transition2 = state2.addTransition(self.sig_arrow_animate, state1)
transition2.addAnimation(self.group_s) # set visible to False first!
self.machine.start()

1 个答案:

答案 0 :(得分:0)

您无法为visible属性设置动画,因为bool不是受支持的动画类型。您应该从动画中删除它,并仅对该属性使用assignProperty

根据文档,动画结束后QState也会分配结束值。这就是为什么即使动画不起作用,最终值也是正确的((编辑)并且该段落不是很有用,因为bool的动画没有执行,所以国家立即改变。)

你需要将state1划分为2个子状态,第一个具有“几何”和“不透明度”属性,第二个由信号propertiesAssigned()触发,当所有子状态发出时当前状态的动画已完成,具有“可见”属性。

state1_1 = QState(state1)
state1_2 = QState(state1)
state1.setInitialState(state1_1)

state1_1.assignProperty(self.label_arrow, "geometry", QtCore.QRect(self.label_arrow.x(),\
                        self.label_arrow.y()+100, self.label_arrow.width(), self.label_arrow.height()))
state1_1.assignProperty(goe, "opacity", 0.5) 

state1_2.assignProperty(self.label_arrow, "visible", False)
state1_1.addTransition(state1_1.propertiesAssigned, state1_2)
...