Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: jack_r от Апрель 26, 2010, 20:45



Название: QParallelAnimationGroup не выполняется до конца
Отправлено: jack_r от Апрель 26, 2010, 20:45
Всем привет. Такая проблема: QParallelAnimationGroup не выполняет анимацию до конца при быстром повторном вызове(быстрее чем длительность анимации). Если же делать без группировки, то всё успевает выполниться.
Код:
        QParallelAnimationGroup *group = new QParallelAnimationGroup;

        QPropertyAnimation *opacAnimCur = new QPropertyAnimation(currentWidget, "opacity", group);
        opacAnimCur->setDuration(mSwitchDuration);
        opacAnimCur->setEasingCurve(QEasingCurve::InExpo);
        opacAnimCur->setStartValue(1);
        opacAnimCur->setEndValue(0);

        QPropertyAnimation *opacAnimHid = new QPropertyAnimation(currentWidget, "opacity", group);
        opacAnimHid->setDuration(mSwitchDuration);
        opacAnimHid->setEasingCurve(QEasingCurve::InExpo);
        opacAnimHid->setStartValue(0);
        opacAnimHid->setEndValue(1);


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: SABROG от Апрель 26, 2010, 21:15
Значит тебе нужна последовательная анимация - QSequentialAnimationGroup.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: jack_r от Апрель 26, 2010, 21:25
Значит тебе нужна последовательная анимация - QSequentialAnimationGroup.
С ней та же проблема.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: SABROG от Апрель 26, 2010, 21:29
Приаттач пример.

Ты передаешь указатель group в качестве родителя для QPropertyAnimation. Ты уверен, что это тоже самое, что и group->addAnimation(anim1); ? Да и вызова group->start(); я не вижу.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: jack_r от Апрель 26, 2010, 23:32
Приаттач пример.
На простом примере всё работает ??? а вот в программе не идёт. Завтра попробую усложнить пример.

Ты передаешь указатель group в качестве родителя для QPropertyAnimation. Ты уверен, что это тоже самое, что и group->addAnimation(anim1); ? Да и вызова group->start(); я не вижу.
Нет, с этими порядок. Когда анимации в качестве родителя передаётся группа, то она автоматически добавляется в эту группу. group->start(); есть, но я не скопипастил.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: jack_r от Апрель 27, 2010, 10:39
Пример. Для того, чтобы увидеть баг нужно несколько раз быстро нажать на кнопку Next или Prev. И будет видно как числа накладываются друг на друга. Так не должно быть, потому что анимация должна доходить до конца и полностью скрывать виджет с числом.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: SABROG от Апрель 28, 2010, 00:24
Напиши багрепорт. А в своей программе попробуй останавливать предыдущую запущенную анимацию, прежде чем создавать новую, а то  судя по всему объекты предыдущей анимации удаляются уже после запуска следующей. Если бы анимация выполнялась минуту и за это время ты бы создал еще сотню параллельных анимаций просто переключая страницы.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: jack_r от Апрель 28, 2010, 14:52
Напиши багрепорт.
Ых неохота  :)
А в своей программе попробуй останавливать предыдущую запущенную анимацию, прежде чем создавать новую, а то  судя по всему объекты предыдущей анимации удаляются уже после запуска следующей.
Похоже на то, но так не должно быть. Ведь без группировки всё выполняется до конца.
Если бы анимация выполнялась минуту и за это время ты бы создал еще сотню параллельных анимаций просто переключая страницы.
то что бы тогда было бы? Мысль обрывается на средине или мне показалось?


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: SABROG от Апрель 29, 2010, 08:26
Похоже на то, но так не должно быть. Ведь без группировки всё выполняется до конца.
Возможно группировка сбивает таймер предыдущей группировки и анимация останавливается раньше времени.

то что бы тогда было бы? Мысль обрывается на средине или мне показалось?

Если бы анимация выполнялась минуту, то за это время ты бы создал еще сотню параллельных анимаций просто переключая страницы

Создал багрепорт:
http://bugreports.qt.nokia.com/browse/QTBUG-10292


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: easgair от Май 07, 2010, 02:45
Всем привет. Такая проблема: QParallelAnimationGroup не выполняет анимацию до конца при быстром повторном вызове(быстрее чем длительность анимации). Если же делать без группировки, то всё успевает выполниться.
Код:
        QParallelAnimationGroup *group = new QParallelAnimationGroup;

        QPropertyAnimation *opacAnimCur = new QPropertyAnimation(currentWidget, "opacity", group);
        opacAnimCur->setDuration(mSwitchDuration);
        opacAnimCur->setEasingCurve(QEasingCurve::InExpo);
        opacAnimCur->setStartValue(1);
        opacAnimCur->setEndValue(0);

        QPropertyAnimation *opacAnimHid = new QPropertyAnimation(currentWidget, "opacity", group);
        opacAnimHid->setDuration(mSwitchDuration);
        opacAnimHid->setEasingCurve(QEasingCurve::InExpo);
        opacAnimHid->setStartValue(0);
        opacAnimHid->setEndValue(1);



Hi, I had the same problem, but solved it by adding these lines in my code:

I had many buttons, and they all had different animations(calculated after pressing of button), so QState was out of question and and I didn't wanted to allow other animations, while one was running. But if user accidently pressed button - it was ok, if there was no immediate results and it required user to press button again...
Код:
...
    arrButton[i]->blockSignals(true);    //you can still press this button, but it will not emit signals...
    connect(seqAnim,SIGNAL(finished()),this,SLOT(onAnimationFinished()));
    seqAnim->start(QAbstractAnimation::DeleteWhenStopped);
...

void onAnimationFinished()
{
for (int i(0); i < 12; i++)
    arrButton[i]->blockSignals(false);
}

That's all.

Somehow I believe, that this is not a bug, but feature - I suggest to look through example code once more, or read documentation ;)
I hope that my example will help in creating animation

Cheers

P.S. Pardon my "russian", but I'm not good cyrilyc writer, but only reader...


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: jack_r от Май 09, 2010, 11:45
Код:
...
    arrButton[i]->blockSignals(true);    //you can still press this button, but it will not emit signals...
    connect(seqAnim,SIGNAL(finished()),this,SLOT(onAnimationFinished()));
    seqAnim->start(QAbstractAnimation::DeleteWhenStopped);
...

void onAnimationFinished()
{
for (int i(0); i < 12; i++)
    arrButton[i]->blockSignals(false);
}
easgair, спасибо за совет. В прикрепленном примере я его реализовал, но всё же считаю, что это баг, а не фича.


Название: Re: QParallelAnimationGroup не выполняется до конца
Отправлено: SABROG от Май 10, 2010, 11:16
Багрепорт отвергли. Так и сказали, не используйте больше одной анимации или группы анимациий на одном и том же объекте и на одних и тех же свойствах.