我正在使用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()
感谢您的帮助!
答案 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)
改变了我的行为。