Анимация в Qt 4.6 - PullRequest
       8

Анимация в Qt 4.6

2 голосов
/ 07 января 2010

У меня есть блок кода, в котором я использовал новую инфраструктуру анимации Qt. Мне нужна анимация только в этом блоке кода, и мне не нужны переменные, связанные с анимацией, в других местах. Очевидно, что анимация не будет работать, если она будет уничтожена до завершения анимации. Например, следующее не работает:

if (animate)
{
    QPropertyAnimation animation(_piece_images[svg_index].getImage(), "pos");
    animation.setDuration(200);
    animation.setEndValue(getCellPos(row, col));
    animation.setEasingCurve(QEasingCurve::InOutSine);
    animation.start();
}

Итак, я использую анимацию, используя указатель:

if (animate)
{
    QPropertyAnimation *animation = new
                  QPropertyAnimation(_piece_images[svg_index].getImage(), "pos");
    animation->setDuration(200);
    animation->setEndValue(getCellPos(row, col));
    animation->setEasingCurve(QEasingCurve::InOutSine);
    animation->start(QAbstractAnimation::DeleteWhenStopped);
}

Мой вопрос: есть ли утечка памяти в приведенном выше решении? Пожалуйста, предоставьте ссылку, если возможно, возможно, я что-то пропустил.

1 Ответ

4 голосов
/ 07 января 2010

Передав QAbstractAnimation::DeleteWhenStopped методу start (), вы должны быть покрыты, пока вы позволяете анимации запускаться до конца, вручную вызываете stop () или явно вызываете delete в какой-то момент. Хотя, если ваш счетчик циклов равен -1 (бесконечно), вы должны сделать ручной вызов stop () или delete.

Документация по параметру DeletionPolicy для start () делает это настолько явным, насколько я думаю, что потребуется. Но вы, конечно, можете поместить некоторый отладочный код, чтобы проверить и убедиться, что деструктор вызывается, когда вы думаете, что должен.

Более того, не помешало бы регулярно запускать Valgrind или другую проверку на утечку. Хорошо привыкнуть раньше, чем позже!

ОБНОВЛЕНИЕ: Если вам интересно, как объект может «удалить это», уловка в том, что есть нечто, называемое QObject :: deleteLater () . Это ставит в очередь удаление так, чтобы это произошло при следующем запуске цикла событий. Если вам когда-нибудь интересно узнать о механике процедуры Qt, не бойтесь взглянуть на источник ... обычно это очень ясно:

http://qt.gitorious.org/qt/qt/blobs/HEAD/src/corelib/animation/qabstractanimation.cpp#line599

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...