您不需要动画框架来执行任何动画,但它是一种可能对您有用的选项。
听起来您认为 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 数据的示例。