2013-08-30 55 views
0

我创建QPropertyAnimation并将其连接到我的SonogramWidget,这些动画事件垂直滚动长图片。 “长图片”由100个预先计算的QPixmap对象1024x128垂直放置。他们显示在SonogramWidget::paintEvent()QPainter。绘制过程不一定全部为QPixmap,但只能看到它们,考虑小部件高度和当前垂直偏移量。 CPU几乎是免费的,因为QPixmap是显示图片的最快方式。在滚动期间没有大的计算,因为所有的100 QPixmaps都是预先计算的并存储在存储器中。使用Qt动画框架对QPixmap的滚动动画

我看到了奇怪的效果:脉动运动:每秒2次,整个图像稍微加速并向上移动1..2个像素,比平常运动快。当我使用单个60 fps QTimer替换Qt Animation Framework并在SLOT中滚动图像时,效果相同。

视频:http://www.youtube.com/watch?v=KRk_LNd7EBg#t=8(从00:08开始;我的firefox为视频播放本身添加了更多斩碎,谷歌Chrome播放视频效果更好)。

我看到我的Linux和Windows版本的效果相同。

解决方案 我想出了问题:“砍”不是一个bug,它是一个功能!这是整数计算的一个特点,所以有时我们必须为动画设定不同的数字,例如:16,16,16,16,16,16,17,16,16,16,16,16,17,。 ...

+0

你的CPU负载说什么?滚动越慢,可见的“白色”就越多。由于QPainter对于绘制像素是白色还是黑色应该不会产生影响,因此它必须是您的校准。如果你的机器接近极限,我会期望这样的奇怪输出文物。或者,这是“越来越慢”的错觉?不确定。 – Greenflow

+0

所有QPixmaps预先计算并存储在内存中。在滚动期间没有计算。只有黑色像素的整个图像对比度较低,我们没有注意到所描述的效果。 – pavelkolodin

+0

我不知道,所以这是纯粹的猜测。但有时甚至这有助于。 :-)那么,你有可能把全部放在一个pixmap中吗?只是暂时的?只是为了排除100个垂直QPixmaps奇怪地交互? – Greenflow

回答

0

paintEvent添加以下断言:

Q_ASSERT(m_animation->currentValue() == m_animatedPropertyValue); 

如果触发,那么你知道你必须使用currentValue(),而不是属性值。这可能是这种情况。让我知道。