видимо свойство в PyQt Animation Framework и State Machine

Съжалявам за счупения ми английски.

Използвам държавна машина с анимации. Искам да внедря ефекта на избледняване/включване.

състояние1: opactiy = 0 видим = False

състояние2: opactiy = 1 видим = вярно

state1 --> state2: Преместете джаджата отдолу нагоре, първо задайте свойството "visible" на True и след това задайте "opactiy" от 0.0 на 1.0 за 5 секунди.

state2 --> state1: Преместете джаджата отгоре надолу, неговата "opactiy" е от 1.0 до 0.0 за 5 секунди и след това задайте свойството "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()

person lSaint    schedule 05.09.2011    source източник


Отговори (1)


Не можете да анимирате свойството visible, защото bool не се поддържа тип за анимации. Трябва да го премахнете от анимацията и да използвате само assignProperty за това свойство.

Според документацията крайната стойност също се присвоява от QState след края на анимацията. Ето защо, въпреки че анимацията не работи, крайната стойност е правилна ((редактиране) и този параграф не беше много полезен, тъй като анимацията за bool не се изпълнява и така състоянието се променя незабавно ).

Трябва да разделите state1 на 2 подсъстояния, първото със свойствата "geometry" и "opacity", а второто, задействано от сигнала 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)
...
person alexisdm    schedule 05.09.2011
comment
Благодаря ти. Знам какво имаш предвид, премахвам animation_v и използвам само assignProperty за видимо свойство. Но работи по същия начин. Когато състоянието се промени, първо се присвоява видимото свойство, а не след края на анимацията. Пропуснах ли нещо? - person lSaint; 06.09.2011
comment
@lSaint Разбрах погрешно, че проблемът беше, редактирах отговора си, за да осигуря решение. - person alexisdm; 06.09.2011
comment
Страхотен! Да работи. Благодаря отново. Между другото, трябва да промени QFinalState на QState, защото обектът 'QFinalState' няма атрибут 'assignProperty' :) - person lSaint; 06.09.2011