2013-04-23 79 views
2

我想paintEvent()被稱爲每秒60次移動一個小的小部件內的幾個對象。 Widget類似於Chrome瀏覽器的選項卡:當您將選項卡拖動到遠離其位置的位置時,它將向後移動,從而在到達其位置時降低速度。QTimer動畫在QT

我使用QTimer連接到一個插槽,我重新計算一些幾何參數,然後調用update()使qt主循環調用paintEvent(),在那裏繪製一些行和QPixmaps。

但設置爲1/60秒間隔的兩個QTimer對象正在消耗「Core i5 2500K」CPU的10%。 2個計時器的CPU時間不是每次60個刻度? CPU時間的情況是相同的,如果我刪除插槽()QTimer連接到(除「return;」語句)的所有代碼。

+1

我認爲,你的'QApplication :: exec()'循環非常緊密。 '1/60 s = 17 ms',兩個定時器在這些時間間隔最多觸發一次會在兩次事件之間產生差異,大約8ms ...每8ms有一個事件。我會說10%的CPU消耗並不是那麼糟......我甚至不確定你能從_Qt_消息處理系統獲得這樣的分辨率。我建議至少將這些定時器移動到與主GUI線程分開的線程中。 – lapk 2013-04-23 22:52:16

回答

3

通常對於動畫,你讓Qt找出合適的時機。是否有特別的理由讓它跑得這麼快?如果你使用QPropertyAnimation,你可以得到一些非常漂亮的結果,並有流暢的動畫。 EasingCurve也可以給你一些很好的效果。

http://qt.apidoc.info/4.8.5/animation-animatedtiles.html

編輯:另外主叫update 60倍的第二不一定重繪60次的第二;相反,您正在爲60x的事件循環重新請求一次重繪。取決於Qt獲取的時間以及顯卡的刷新率,如果您的程序的主要GUI事件循環可能只能重新繪製圖形20-35x秒,則會忽略多個update調用。如果您要求每秒鐘繪製60x,您可以使用repaint()。但在大多數情況下,您應該致電update。你

http://qt-project.org/doc/qt-4.8/qwidget.html#update

同時也應該嘗試緩存儘可能多的計算,你可以,如果這麼多的減緩你的電腦了。 希望有所幫助。

+0

我的應用程序是跨平臺的。在Linux 30 fps看起來很順利,但對於Windows而言,平滑度從60 fps開始。 – pavelkolodin 2013-04-26 12:01:30

0

等等,我認爲設計有問題。你能否澄清你實際想要達到的目標?或者「拖動」一些小部件內容並將其移回到mouseRelease上(例如)或試圖拖走讓我們從標籤小部件中說出頁面並將其緩慢移回?

我問,因爲如果你需要插件走動你不需要調用的paintEvent 60次第二,你需要解決部件幾何形狀和位置,肯定不會叫的更新()自己,或者如果您正在討論小部件內容,那麼您應該查看子類化QGraphicsEffect。