我只使用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无法同时触发N
个QPropertyAnimation
个QPropertyAnimation::start()
个实例的刻度,因为您可能已经在不同时间启动了这些动画() - 假设QPropertyAnimation
之间有8毫秒。N
实例连接到某种代理对象,该代理对象将标记传送到{{1}}小部件;所有这些小部件都有一个成员'animTick(void)'。答案 0 :(得分:0)
如果你想要的只是“滴答声”的来源,那么你所需要的只是QVariantAnimation
,甚至不是QPropertyAnimation
。
动画越多,CPU成本就越高。你想要的只是一个动画,其valueChanged(QVariant)
信号连接到多个小部件。
请注意,QBasicTimer
不是任何内容的来源,它是QObject::startTimer()
返回的计时器ID的非常薄的包装器。因此,它只能在QObject
实例中使用,并且仅在您重新实现timerEvent(...)
时才有效。
QVariantAnimation
只是一个很好的定时刻度的来源,所以你不需要重新发明轮子。
如果您想要一个向多个对象发送信号的通用计时器,您真的需要一个QTimer
。这就是它的用途。这样您就不需要代理对象,因为您可以将一个信号连接到多个插槽。如果您愿意,您还可以将信号连接到信号 - 因此您可以转发或别名信号。 QTimer
只是QObject
,timerEvent(...)
会发出信号。这就是它的全部内容。写自己的东西真是太傻了。