Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多个QPropertyImation实例与单个实例?_C++_Qt_Animation_Cross Platform - Fatal编程技术网

C++ 多个QPropertyImation实例与单个实例?

C++ 多个QPropertyImation实例与单个实例?,c++,qt,animation,cross-platform,C++,Qt,Animation,Cross Platform,我使用QPropertyAnimation只是作为记号的来源。我设置1秒动画,无限循环,调用start(),然后在“tick handler”中观察QeReleasedTimer::Appeased(),以了解从动画开始经过了多少时间。所以,我不依赖循环计数、动画开始和停止值,也不关心正在设置动画的属性值。只是蜱虫的来源 在此之前,我使用的是QTimer,它在Linux和Windows上给出了不同的结果:为了使Linux中的动画平滑,我必须使用QTimerinterval=1000/30,但对于

我使用
QPropertyAnimation
只是作为记号的来源。我设置1秒动画,无限循环,调用
start()
,然后在“tick handler”中观察QeReleasedTimer::Appeased(),以了解从动画开始经过了多少时间。所以,我不依赖循环计数、动画开始和停止值,也不关心正在设置动画的属性值。只是蜱虫的来源

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

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

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

  • N
    运行
    QPropertyAnimation
    实例,每个实例都连接到自己的小部件;Qt文档显示,
    QPropertyAnimation
    fire滴答声在滴答声之间约为每秒60帧=~17毫秒。但是Qt不能同时从
    N
    不同的
    QPropertyAnimation
    实例触发勾号,因为您可能在不同的时间()启动了这些动画-假设
    QPropertyAnimation::start()之间有8毫秒
  • 1个运行的
    QPropertyAnimation
    实例连接到某种代理对象,该代理对象将标记传输到
    N
    小部件;所有这些小部件都有一个成员“animTick(void)”

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

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

请注意,
QBasicTimer
不是任何东西的来源,它是一个非常薄的包装器,它围绕着
QObject::startTimer()
返回的计时器id。因此,它只在
QObject
实例中工作,并且只在重新实现
timerEvent(…)
时工作

QVariantAnimation
只是一个时间精确的节拍源,因此您无需重新发明轮子


如果您想要一个向多个对象发送信号的通用计时器,那么您确实需要一个
QTimer
。这就是它的目的。这样,您就不需要代理对象,因为您可以将一个信号连接到多个插槽。如果您愿意,还可以将信号连接到信号,这样您就可以转发或别名信号。
QTimer
只是一个发出信号的
QObject
,带有
timerEvent(…)
。就这些。写自己的东西是愚蠢的。

根据你的帖子,我担心你想做的事情是令人绝望的复杂,与许多Qt习惯用法背道而驰。这是一个开源项目吗?如果是这样的话,你能给我一个到存储库的链接吗?@KubaOber我已经建立了一个聊天室。据我所知,我需要QBasicTimer来制作ticks,而不是任何类型的Q***动画类。但如果我需要100个动画,我更喜欢1个QBasicTimer和1个代理对象来向100个QoObject传输滴答声,因为QBasicTimer越多,CPU负载就越大……不,如果你想要一个定时信号源,你就需要一个
QTimer
,而不需要代理。我确信这一点
QBasicTimer
是一个微优化,如果你想在
QObject
中找到一个滴答声源。但是QBasicTimer更轻量级!不是很轻吗?但它甚至不使用信号槽,所以主事件循环每秒不会做60次无用的工作!如果使用QBasicTimer发出信号,这相当于使用QTimer。这就是QTimer所做的。只要看看QTimer的来源就可以了。如果您认为某个因素导致了性能损失,那么最好使用探查器转储来说明情况。否则你只是在幻想。audigger代码显示,我担心,许多微观优化实际上是零基础的。据我所知,QBasicTimer可以在不发出任何信号的情况下启动QObject。我的想法没有资料搜集的证据。我99%同意你的看法,我不会因为QTimer而受到任何明显的性能惩罚。剩下的1%是我对微优化的偏好:)