gpt4 book ai didi

c++ - Qt 4.6 中的动画

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:06 24 4
gpt4 key购买 nike

我有一段代码,其中使用了 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);
}

我的问题是,上述解决方案是否存在内存泄漏?如果可能请提供引用,可能我遗漏了什么。

最佳答案

通过将 QAbstractAnimation::DeleteWhenStopped 传递给 start() 方法,只要您允许动画运行完成、手动调用 stop() 或显式调用 delete,您就应该被覆盖在某一点。尽管如果您的循环计数为 -1(无限),那么您必须手动调用 stop() 或 delete。

DeletionPolicy parameter to start() 的文档使这一点像我认为需要的那样明确。但是您当然可以放入一些调试代码来检查并确保析构函数在您认为应该调用的时候被调用。

此外,定期运行 Valgrind 也没什么坏处。或另一个泄漏检查器。养成习惯越早越好!

更新:如果您对一个对象如何能够“删除它”感到好奇,诀窍是有一个叫做 QObject::deleteLater() 的东西。 .它将删除排队,以便在下次事件循环运行时发生。如果您对 Qt 例程的机制感到好奇,请不要害怕去查看源代码……它通常非常清楚:

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

关于c++ - Qt 4.6 中的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2018299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com