2013-08-30 56 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(),而不是屬性值。這可能是這種情況。讓我知道。