许多QPropertyAnimation实例VS单一?

时间:2013-08-31 18:18:56

标签: c++ qt animation cross-platform

我只使用QPropertyAnimation作为刻度的来源。我设置1秒动画,无限循环次数,调用start(),然后在“tick tick”中观察QElapsedTimer :: elapsed(),以了解从动画开始经过的时间。所以,我不依赖于循环计数,动画开始和停止值,我不关心正在动画的属性值。只是滴答声的来源!

在此之前我使用QTimer在Linux和Windows上提供不同的结果:为了使动画在Linux中流畅,我必须使用QTimer interval = 1000/30,但对于Windows 1000 / 60是最低限度。所以我不得不使用#ifndef,但这是一个脏代码。除此之外,QTimer使用信号槽机制,但QPropertyAnimation没有,所以我的QApplication事件循环不忙于动画事件(我是否正确?)

现在我需要为N小部件设置动画(每种动画都有不同类型的动画),我将以相同的方式使用QPropertyAnimation - 作为同样愚蠢的刻度源。

这些变体之间的CPU成本差异是什么:

  • N运行QPropertyAnimation个实例,每个实例都连接到自己的小部件; Qt文档说,QPropertyAnimation在刻度线之间大约60fps = ~17 ms时发出嘀嗒声。但Qt无法同时触发NQPropertyAnimationQPropertyAnimation::start()个实例的刻度,因为您可能已经在不同时间启动了这些动画() - 假设QPropertyAnimation之间有8毫秒。
  • 1个单独运行的N实例连接到某种代理对象,该代理对象将标记传送到{{1}}小部件;所有这些小部件都有一个成员'animTick(void)'。

1 个答案:

答案 0 :(得分:0)

如果你想要的只是“滴答声”的来源,那么你所需要的只是QVariantAnimation,甚至不是QPropertyAnimation

动画越多,CPU成本就越高。你想要的只是一个动画,其valueChanged(QVariant)信号连接到多个小部件。

请注意,QBasicTimer不是任何内容的来源,它是QObject::startTimer()返回的计时器ID的非常薄的包装器。因此,它只能在QObject实例中使用,并且仅在您重新实现timerEvent(...)时才有效。

QVariantAnimation只是一个很好的定时刻度的来源,所以你不需要重新发明轮子。

如果您想要一个向多个对象发送信号的通用计时器,您真的需要一个QTimer。这就是它的用途。这样您就不需要代理对象,因为您可以将一个信号连接到多个插槽。如果您愿意,您还可以将信号连接到信号 - 因此您可以转发或别名信号。 QTimer只是QObjecttimerEvent(...)会发出信号。这就是它的全部内容。写自己的东西真是太傻了。