1

我正在使用 Python 2.7 和 PyQt 4.0。

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

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()

谢谢您的帮助!

4

2 回答 2

3

您的示例不起作用的原因是您没有保留对方法中QGraphicsItemAnimationcreated的引用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()
于 2013-10-21T16:56:24.667 回答
2

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

代替

animation = QGraphicsItemAnimation()

animation = QGraphicsItemAnimation(self)

这改变了我的行为。

于 2013-10-21T15:55:43.073 回答