您不需要動畫框架來做任何動畫,但它是一個可能對您有用的選項。
這聽起來像你認爲QTimer應該同步到繪畫事件,但實際上並不重要。
如果你想象的對象開始動畫像這樣在第一次時,從A移動到B.很多人,沒有框架,只會有一個更新功能,做這樣的事情: -
QPoint pos(pObject->getPos()); // get the current position
pObject->setPos(pos + QPoint(2, 0); // set the position to previous + 2;
在這種情況下,對象的更新取決於計算機運行的速度;無論渲染幀速率如何,對象的移動速度越快,對象的移動速度越快。要修復此問題,以使對象以相同的速率移動,而不管機器的計算能力如何,更新功能需要考慮到自上次更新和要素在: -
QPoint updateSpeed(30,0); // speed at which the object will move
int deltaTime = m_timer.elapsed(); // how long since we last updated
QPoint newPos = pObject->getPos() + QPoint(updateSpeed.X() * deltaTime, updateSpeed.Y());
pObject->setPos(newPos);
所以,現在該對象的動畫是時間依賴,無論在哪個渲染器將繪製對象的速度,它總是在運行相同的速率。在較慢的機器上,兩次更新之間的時間間隔更長,因此與更快的機器相比,對象移動的距離更多是在更新之間。兩臺以不同速度運行的機器將在相同的時間內保持物體的移動距離相同。
回到你的問題,你說你是從一個數學函數計算圖像,只要圖像根據時間更新,就像上面例子中的動畫對象是動畫一樣,然後您只需要一個計時器以每秒30或60幀的速度調用QPixmap上的update()函數,並且無需將其鏈接到圖像數據計算的更新。
最後,如果這沒有回答你的問題,據我瞭解,請張貼一個如何生成QPixmap數據的例子。
Qt對於類似的東西並不是很好。爲了獲得平滑的結果,請嘗試Qt 5.1,QML,並最好使用着色器程序(GPU)計算圖像。我認爲這是您用Qt獲得平滑60fps的最佳選擇。或者只是在適當的時間間隔內滿足QTimer的要求:不完全平滑但可能適用於桌面應用程序... – hyde