我希望每秒调用paintEvent()60次,以便在一个小小部件中移动几个对象。小部件类似于Chrome浏览器的标签:当您将标签拖离其位置时,它会向后移动,从而降低到达其位置时的速度。
我使用QTimer连接到一个插槽,我重新计算一些几何参数,然后调用update()使qt主循环调用paintEvent(),其中我画了一些线和QPixmaps。
但是,设置为1/60秒间隔的两个QTimer对象占用了“Core i5 2500K”CPU的10%。 2个定时器的CPU时间不是太多,每秒60个滴答?如果我删除QTimer所连接的槽()中的所有代码(“return;”语句除外),则CPU时间的情况是相同的。
答案 0 :(得分:3)
通常对于动画,你让Qt找出合适的时机。有这么快的特定原因吗?如果您使用QPropertyAnimation,您可以获得一些非常光滑的结果,并具有流畅的动画效果。 EasingCurve
也可以给你带来很好的效果。
http://qt.apidoc.info/4.8.5/animation-animatedtiles.html
编辑:每秒拨打update
60x并不一定每秒重绘60次;相反,你每秒60x将事件循环请求重绘一次。取决于Qt获得的时间和图形卡的刷新率以及不是,如果程序的主GUI事件循环可能只是每秒重新绘制图形20-35x,那么多个update
调用被忽略了。如果您要求每秒抽取60倍,您将使用repaint()
。但在大多数情况下,您应该致电update
。
http://qt-project.org/doc/qt-4.8/qwidget.html#update
此外,如果计算机速度下降太多,您应该尝试尽可能多地缓存计算。 希望有所帮助。
答案 1 :(得分:0)
等等,我觉得设计有问题。你能澄清你实际想要实现的目标吗?要么“拖动”一些小部件内容并将其移回mouseRelease(例如)或尝试从标签小部件中拖出让我们说的页面并将其慢慢移回?
我在问,因为如果你需要移动小部件,你不需要每秒调用paintEvent 60次,你需要解决小部件几何和位置,肯定不会调用更新( )你自己,或者如果你在谈论小部件内容,那么你应该看看子类化QGraphicsEffect。