PyQt 小部件的平滑更新更改

Update changes smoothly of a PyQt widget

我有一个看起来像这样的 PyQt5 应用程序 This。现在,使用 "bailar" 按钮,我希望网格上的角色向左和向右看几次。我通过以下方法执行此操作:

def dance(self):
    """
    Make the P1 dance
    """
    p1 = self._objects['P1']
    x = p1.x
    y = p1.y

    cell = self.worldGrid[y][x]

    for i in xrange(3):
        print("Moving my head...")
        cell.objectLeaves('P1')
        p1.pixmap = p1.pixmap.transformed(QTransform().scale(-1, 1))
        cell.objectArrives('P1', p1)
        time.sleep(0.2)

但是,包含像素图的标签仅在最后一次迭代时更新。我知道这一定是更新函数异步和 time.sleep() 阻塞主线程的问题,但我不知道我还能如何显示动画。我尝试将 QThread 与 moveToThread 方法一起使用,但它失败了,因为 gird 小部件是主要 window 的子项。有什么想法吗?

您只能看到动画的最后一帧,因为 UI 在 dance 函数终止之前不会被 Qt 更新。如果您在 time.sleep(0.2) 语句之前添加 QtGui.qApp.processEvents(),则动画的每一帧都会更新 UI。

请注意,在动画完成之前,用户仍然无法与您的应用程序交互。对于像这样的短动画,这可能不是问题,但对于较长的动画,您最好使用 QTimer 或 Brendan Abel 建议的 Qt 动画框架。