0

QPropertyAnimation只是用作蜱的来源。我设置了 1 秒的动画,无限数量的循环,调用start()然后在“tick 处理程序”中观看 QElapsedTimer::elapsed() 以了解从动画开始经过了多少时间。所以,我不依赖循环计数、动画开始和停止值,也不关心正在动画的属性值。只是蜱虫的来源!

在此之前,我使用QTimer它在 Linux 和 Windows 上给出了不同的结果:为了在 Linux 中平滑动画,我必须使用QTimer间隔 = 1000/30,但对于 Windows 1000/60 是最小值。所以我不得不使用#ifndef,但这是一个肮脏的代码。除此之外,QTimer 使用信号槽机制,但 QPropertyAnimation 没有,所以我的 QApplication 事件循环不忙于动画事件(我正确吗?)

现在我需要为N小部件制作动画(每个小部件都有不同类型的动画),并且我将以相同的方式使用 QPropertyAnimation - 作为相同的愚蠢来源。

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

  • N运行QPropertyAnimation实例,每个实例都连接到自己的小部件;Qt 文档说,QPropertyAnimation在滴答声之间以大约 60fps = ~17 ms 的速度滴答作响。但是 Qt 不能同时从N不同的QPropertyAnimation实例触发滴答声,因为您可能在不同的 time() 开始了这些动画 - 假设QPropertyAnimation::start().
  • QPropertyAnimation1 个连接到某种代理对象的单个运行实例,该代理对象将滴答声传输到N小部件;所有这些小部件都有一个成员 'animTick(void)' 。
4

1 回答 1

0

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

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

请注意, aQBasicTimer不是任何东西的来源,它是一个非常薄的包装器,围绕着QObject::startTimer(). 因此,它仅在一个QObject实例中有效,并且仅在您重新实现timerEvent(...).

QVariantAnimation只是一个很好的定时滴答来源,因此您无需重新发明轮子。

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

于 2013-09-02T17:43:18.540 回答