Russian Qt Forum
Ноябрь 24, 2024, 20:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QParallelAnimationGroup не выполняется до конца  (Прочитано 6292 раз)
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);
Записан
SABROG
Гость
« Ответ #1 : Апрель 26, 2010, 21:15 »

Значит тебе нужна последовательная анимация - QSequentialAnimationGroup.
Записан
jack_r
Гость
« Ответ #2 : Апрель 26, 2010, 21:25 »

Значит тебе нужна последовательная анимация - QSequentialAnimationGroup.
С ней та же проблема.
Записан
SABROG
Гость
« Ответ #3 : Апрель 26, 2010, 21:29 »

Приаттач пример.

Ты передаешь указатель group в качестве родителя для QPropertyAnimation. Ты уверен, что это тоже самое, что и group->addAnimation(anim1); ? Да и вызова group->start(); я не вижу.
« Последнее редактирование: Апрель 26, 2010, 21:33 от SABROG » Записан
jack_r
Гость
« Ответ #4 : Апрель 26, 2010, 23:32 »

Приаттач пример.
На простом примере всё работает Непонимающий а вот в программе не идёт. Завтра попробую усложнить пример.

Ты передаешь указатель group в качестве родителя для QPropertyAnimation. Ты уверен, что это тоже самое, что и group->addAnimation(anim1); ? Да и вызова group->start(); я не вижу.
Нет, с этими порядок. Когда анимации в качестве родителя передаётся группа, то она автоматически добавляется в эту группу. group->start(); есть, но я не скопипастил.
« Последнее редактирование: Апрель 27, 2010, 10:32 от jack_r » Записан
jack_r
Гость
« Ответ #5 : Апрель 27, 2010, 10:39 »

Пример. Для того, чтобы увидеть баг нужно несколько раз быстро нажать на кнопку Next или Prev. И будет видно как числа накладываются друг на друга. Так не должно быть, потому что анимация должна доходить до конца и полностью скрывать виджет с числом.
Записан
SABROG
Гость
« Ответ #6 : Апрель 28, 2010, 00:24 »

Напиши багрепорт. А в своей программе попробуй останавливать предыдущую запущенную анимацию, прежде чем создавать новую, а то  судя по всему объекты предыдущей анимации удаляются уже после запуска следующей. Если бы анимация выполнялась минуту и за это время ты бы создал еще сотню параллельных анимаций просто переключая страницы.
Записан
jack_r
Гость
« Ответ #7 : Апрель 28, 2010, 14:52 »

Напиши багрепорт.
Ых неохота  Улыбающийся
А в своей программе попробуй останавливать предыдущую запущенную анимацию, прежде чем создавать новую, а то  судя по всему объекты предыдущей анимации удаляются уже после запуска следующей.
Похоже на то, но так не должно быть. Ведь без группировки всё выполняется до конца.
Если бы анимация выполнялась минуту и за это время ты бы создал еще сотню параллельных анимаций просто переключая страницы.
то что бы тогда было бы? Мысль обрывается на средине или мне показалось?
Записан
SABROG
Гость
« Ответ #8 : Апрель 29, 2010, 08:26 »

Похоже на то, но так не должно быть. Ведь без группировки всё выполняется до конца.
Возможно группировка сбивает таймер предыдущей группировки и анимация останавливается раньше времени.

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

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

Создал багрепорт:
http://bugreports.qt.nokia.com/browse/QTBUG-10292
« Последнее редактирование: Апрель 29, 2010, 08:34 от SABROG » Записан
easgair
Гость
« Ответ #9 : Май 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...
Записан
jack_r
Гость
« Ответ #10 : Май 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, спасибо за совет. В прикрепленном примере я его реализовал, но всё же считаю, что это баг, а не фича.
Записан
SABROG
Гость
« Ответ #11 : Май 10, 2010, 11:16 »

Багрепорт отвергли. Так и сказали, не используйте больше одной анимации или группы анимациий на одном и том же объекте и на одних и тех же свойствах.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 21.