видимое свойство в PyQt Animation Framework и State Machine - PullRequest
1 голос
/ 05 сентября 2011

Извините за мой сломанный английский.

Я использую конечный автомат с анимацией. Я хочу реализовать эффект постепенного исчезновения / эффекта.

State1: opactiy = 0 видимый = ложный

State2: opactiy = 1 видимый = True

state1 -> state2: Переместите виджет снизу вверх, сначала установите для свойства visible значение True, а затем установите «opactiy» от 0,0 до 1,0 за 5 секунд.

state2 -> state1: Переместите виджет сверху вниз, его «opactiy» будет от 1.0 до 0.0 за 5 секунд, а затем установите для свойства «visible» виджета значение False.

Но проблема в том, что когда состояние2 равно состоянию1, оно всегда устанавливает для свойства 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 голосов
/ 05 сентября 2011

Вы не можете анимировать свойство visible, потому что bool не поддерживается типом для анимации.Вы должны удалить его из анимации и использовать только assignProperty для этого свойства.

В соответствии с документацией конечное значение также присваивается QState после окончания анимации.Вот почему, даже если анимация не работает, конечное значение является правильным ( (правка) , и этот абзац не очень помог, так как анимация для bool не выполняется, и поэтому состояние изменяетсянемедленно).

Вам нужно разделить state1 на 2 подсостояния, первое со свойствами «геометрия» и «непрозрачность», а второе, вызванное сигналом propertiesAssigned(), который испускается привсе анимации для текущего состояния завершены со свойством visible.

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