您不需要动画框架来做任何动画,但它是一个可能对您有用的选项。
这听起来像你认为QTimer应该同步到绘画事件,但实际上并不重要。
如果你想象的对象开始动画像这样在第一次时,从A移动到B.很多人,没有框架,只会有一个更新功能,做这样的事情: -
QPoint pos(pObject->getPos()); // get the current position
pObject->setPos(pos + QPoint(2, 0); // set the position to previous + 2;
在这种情况下,对象的更新取决于计算机运行的速度;无论渲染帧速率如何,对象的移动速度越快,对象的移动速度越快。要修复此问题,以使对象以相同的速率移动,而不管机器的计算能力如何,更新功能需要考虑到自上次更新和要素在: -
QPoint updateSpeed(30,0); // speed at which the object will move
int deltaTime = m_timer.elapsed(); // how long since we last updated
QPoint newPos = pObject->getPos() + QPoint(updateSpeed.X() * deltaTime, updateSpeed.Y());
pObject->setPos(newPos);
所以,现在该对象的动画是时间依赖,无论在哪个渲染器将绘制对象的速度,它总是在运行相同的速率。在较慢的机器上,两次更新之间的时间间隔更长,因此与更快的机器相比,对象移动的距离更多是在更新之间。两台以不同速度运行的机器将在相同的时间内保持物体的移动距离相同。
回到你的问题,你说你是从一个数学函数计算图像,只要图像根据时间更新,就像上面例子中的动画对象是动画一样,然后您只需要一个计时器以每秒30或60帧的速度调用QPixmap上的update()函数,并且无需将其链接到图像数据计算的更新。
最后,如果这没有回答你的问题,据我了解,请张贴一个如何生成QPixmap数据的例子。
Qt对于类似的东西并不是很好。为了获得平滑的结果,请尝试Qt 5.1,QML,并最好使用着色器程序(GPU)计算图像。我认为这是您用Qt获得平滑60fps的最佳选择。或者只是在适当的时间间隔内满足QTimer的要求:不完全平滑但可能适用于桌面应用程序... – hyde