我想知道如何在pyqt5中缓慢移动标签,可以说标签是游戏的对象(箭头,子弹等),但标签必须在游戏的整个过程中自动移动>
self.label_enemy = QLabel(self)
self.label_enemy.setGeometry(400, 50, 20, 20)
self.label_enemy.setStyleSheet("background-color: blue")
self.distancia_enemy = 4
答案 0 :(得分:1)
您需要使用QPropertyAnimation,它允许您设置 target 对象的特定属性的动画开始和结束值。在您的情况下, target 是标签,而 property 是pos QProperty。
记住一些重要的事情:
object.setProperty('propertyName', value)
“创建”新属性,或使用QtCore.pyqtProperty
decorator; from PyQt5 import QtCore, QtWidgets
class AnimationArea(QtWidgets.QWidget):
def __init__(self):
super(AnimationArea, self).__init__()
self.setFixedSize(640, 480)
self.enemy = QtWidgets.QLabel('X', self)
self.enemyAnimation = QtCore.QPropertyAnimation(self.enemy, b'pos')
# set a start value for the animation; if we don't provide this
# the animation will use the end value as soon as it finishes.
self.enemyAnimation.setStartValue(self.enemy.pos())
# set an end value for the animation; this is always required.
self.enemyAnimation.setEndValue(QtCore.QPoint(400, 200))
self.enemyAnimation.setDuration(2000)
def start(self):
self.enemyAnimation.start()
class AniWindow(QtWidgets.QWidget):
def __init__(self):
super(AniWindow, self).__init__()
layout = QtWidgets.QVBoxLayout()
self.setLayout(layout)
self.animationArea = AnimationArea()
layout.addWidget(self.animationArea)
self.startButton = QtWidgets.QPushButton('Start')
layout.addWidget(self.startButton)
self.startButton.clicked.connect(self.animationArea.start)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
aniWindow = AniWindow()
aniWindow.show()
sys.exit(app.exec_())
对于更复杂的路径,有两种解决方案。
这使用QSequentialAnimationGroup来连接多个动画。优点是您可以为每个段设置不同的速度,但是始终为线性路径。由于动画是连续的(并且我们将在结尾处返回到开始位置),因此您只需要设置结束值即可。此摘要将使您的敌人绕三角形移动。
self.enemyAnimation = QtCore.QSequentialAnimationGroup()
first = QtCore.QPropertyAnimation(self.label_enemy, b'pos')
first.setEndValue(QtCore.QPoint(0, 400))
first.setDuration(1000)
second = QtCore.QPropertyAnimation(self.label_enemy, b'pos')
second.setEndValue(QtCore.QPoint(400, 400))
second.setDuration(2000)
third = QtCore.QPropertyAnimation(self.label_enemy, b'pos')
third.setEndValue(QtCore.QPoint(0, 0))
third.setDuration(3000)
self.enemyAnimation.addAnimation(first)
self.enemyAnimation.addAnimation(second)
self.enemyAnimation.addAnimation(third)
QPainterPath可用于绘制更复杂(和非线性)的路径。对于这种方法,您需要使用从0.0
到1.0
的{{3}}和QVariantAnimation函数,该函数返回路径的任意百分比的坐标。在这种情况下,我使用了一条线段和一条曲线。
self.enemyAnimation = QtCore.QVariantAnimation()
# *BOTH* start and end values *HAVE* to be float!
self.enemyAnimation.setStartValue(0.0)
self.enemyAnimation.setEndValue(1.0)
self.enemyAnimation.setDuration(2000)
self.enemyPath = QtGui.QPainterPath()
self.enemyPath.lineTo(100, 400)
self.enemyPath.quadTo(400, 400, 400, 0)
self.enemyAnimation.valueChanged.connect(self.moveEnemy)
def moveEnemy(self, percent):
self.label_enemy.move(self.enemyPath.pointAtPercent(percent).toPoint())