PyQt动画QGraphicsItem不起作用

时间:2013-10-21 14:14:38

标签: python-2.7 pyqt4

我正在使用Python 2.7和PyQt 4.0。

我正在尝试让QGraphicsRectItem在动画中移动10像素。我已经阅读了文档和几个教程,但我无法让它工作。我的代码出了什么问题?

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import random

class TestWidget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.scene = QGraphicsScene()
        self.view = QGraphicsView(self.scene)
        self.button1 = QPushButton("Do test")
        self.button2 = QPushButton("Move forward 10")

        layout = QVBoxLayout()
        buttonLayout = QHBoxLayout()
        buttonLayout.addWidget(self.button1)
        buttonLayout.addWidget(self.button2)
        buttonLayout.addStretch()
        layout.addWidget(self.view)
        layout.addLayout(buttonLayout)
        self.setLayout(layout)

        self.button1.clicked.connect(self.do_test)
        self.button2.clicked.connect(self.move_forward)

    def do_test(self):
        self.turtle = self.scene.addRect(0,0,10,20)

    def move_forward(self):
        animation = QGraphicsItemAnimation()
        timeline = QTimeLine(1000)
        timeline.setFrameRange(0,100)
        animation.setTimeLine(timeline)
        animation.setItem(self.turtle)
        animation.setPosAt(1.0, QPointF(self.turtle.x(),self.turtle.y()+10))
        timeline.start()

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您的示例不起作用的原因是您没有保留对QGraphicsItemAnimation方法中创建的move_forward的引用,因此在它有机会之前会被垃圾收集做任何事。

我建议您在__init__中创建动画,以便以后可以作为实例属性访问它:

def __init__(self, parent=None):
    ...
    self.animation = QGraphicsItemAnimation()

def move_forward(self):
    timeline = QTimeLine(1000)
    timeline.setFrameRange(0, 100)
    self.animation.setTimeLine(timeline)
    self.animation.setItem(self.turtle)
    self.animation.setPosAt(
        1.0, QPointF(self.turtle.x(), self.turtle.y() + 10))
    timeline.start()

答案 1 :(得分:2)

尝试这个小改动(在函数move_forward中)。

替换

animation = QGraphicsItemAnimation()

animation = QGraphicsItemAnimation(self)

改变了我的行为。