2011-09-05 3 views
1

내 부러진 영어에 대해 죄송합니다.PyQt의 visible 속성 애니메이션 프레임 워크 및 상태 머신

애니메이션이있는 상태 시스템을 사용하고 있습니다. 페이드 아웃/인 효과를 구현하고 싶습니다.

상태 1 : opactiy = 1 볼 수 = 진정한

상태 1 -> 상태 2 : = 0 볼 수 = 거짓

상태 2 opactiy 상하로에서 위젯을 이동 설정 "볼 "속성을 True로 설정 한 다음 을"opactiy "를 0.0 초에서 1.0 초로 5 초 내에 설정하십시오.

state2 -> state1 : 위젯을 위에서 아래로 이동하고 "opactiy"는 1.0에서 0.0으로 5 초이며 위젯의 "visible"속성을 False로 설정합니다.

그러나 문제는 상태 2에서 상태 1 일 때 항상 "visible"속성을 False로 설정했기 때문에 QSequentialAnimationGroup을 사용하고 opactiy_animation을 먼저 설정한다고해도 페이드 아웃 효과없이 위젯이 사라지는 것입니다.

어떻게 페이드 아웃 효과를 얻습니까?

강령은 : bool 애니메이션에 대한 지원 형식이 아니기 때문에

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() 

답변

0

당신은 visible 속성에 애니메이션 수 없습니다. 애니메이션에서 제거해야하며 해당 속성에 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) 
... 
+0

감사합니다. 나는 당신이 의미하는 것을 안다, 나는 animation_v를 제거하고 "visible"속성에 대해서만 assignProperty를 사용한다. 그러나 그것은 똑같이 작동합니다. 상태가 변경되면 애니메이션의 끝 부분이 아니라 먼저 "보이는"속성이 지정됩니다. 내가 뭐 놓친 거 없니? – lSaint

+0

@lSaint 나는 문제가 해결되었다고 오해했습니다. 해결책을 제공하기 위해 제 대답을 편집했습니다. – alexisdm

+0

좋아요! 그것은 작동합니다. 다시 한번 감사드립니다. 그건 그렇고, 'QFinalState'객체에는 'assignProperty'속성이 없으므로 QFinalState를 QState로 변경해야합니다. :) – lSaint