2

我希望 paintEvent() 每秒被调用 60 次以在一个小部件内移动几个对象。Widget 类似于 chrome 浏览器的选项卡:当您将选项卡拖离其位置很远时,它会向后移动,当它到达其位置时会降低速度。

我使用连接到插槽的 QTimer,我在其中重新计算一些几何参数,然后调用 update() 以使 qt 主循环调用paintEvent(),在其中绘制一些线条和 QPixmap。

但是设置为 1/60 秒间隔的两个 QTimer 对象正在消耗 10% 的“Core i5 2500K”CPU。对于每个每秒 60 个滴答声的 2 个计时器来说,这不是太多的 CPU 时间吗?如果我从 QTimer 连接到的 slot() 中删除所有代码(“return;”语句除外),CPU 时间的情况是相同的。

4

2 回答 2

3

通常对于动画,你让 Qt 找出合适的时机。运行这么快有什么特别的原因吗?如果您使用 QPropertyAnimation,您可以获得一些非常漂亮的结果,以及流畅的动画。EasingCurves 也可以给你一些很好的效果。

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

编辑:每秒调用update60 次也不一定每秒重绘 60 次;取而代之的是,您将 requests-for-a-repaint 每秒 60 次放在事件循环上。根据 Qt 获得的时间和显卡的刷新率以及其他情况,如果程序的主 GUI 事件循环可能只能以每秒 20-35 次的速度重绘图形,则多个update调用将被忽略。如果您要求每秒绘制 60 倍,您将使用repaint(). 但在大多数情况下,您应该调用update.

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

此外,如果它使您的计算机速度变慢,您应该尝试尽可能多地缓存计算。希望有帮助。

于 2013-04-24T02:40:58.843 回答
0

等等,我认为设计有问题。你能澄清一下你真正想要达到的目标吗?要么“拖动”一些小部件内容并将其移回mouseRelease(例如),要么尝试将页面从选项卡小部件中拖走并将其缓慢移回?

我在问,因为如果你需要移动小部件,你不需要每秒调用 60 次paintEvent,你需要处理小部件的几何和位置,当然不要自己调用 update(),或者如果你在谈论小部件内容,那么您应该查看子类化 QGraphicsEffect。

于 2013-04-24T08:02:23.187 回答