Python 使用QPropertyAnimation的线动画

Python 使用QPropertyAnimation的线动画,python,animation,pyqt,pyqt5,qpropertyanimation,Python,Animation,Pyqt,Pyqt5,Qpropertyanimation,尝试使用PyQt5并使用QPropertyImation将一条线从零增长到(0,0)到(200200)的动画。我已经阅读了很多关于Qt的文档,并尝试了几个示例,但我就是无法让它工作。这是我现在拥有的代码: from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QWidget, QLabel from PyQt5.QtGui import QPainter, QPixmap, QPainterPath from PyQ

尝试使用PyQt5并使用QPropertyImation将一条线从零增长到(0,0)到(200200)的动画。我已经阅读了很多关于Qt的文档,并尝试了几个示例,但我就是无法让它工作。这是我现在拥有的代码:

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QPainter, QPixmap, QPainterPath
from PyQt5.QtCore import QObject, QPointF, QPropertyAnimation, pyqtProperty
from PyQt5.QtCore import QLineF
import sys


class Sample(QWidget):

    l1 = QLineF(QPointF(), QPointF())

    def __init__(self):
        super().__init__()

        self.initView()
        self.initAnimation()

    def initView(self):    
        self.show()

    def initAnimation(self):
        self.anim = QPropertyAnimation(self.l1, b'geometry')
        self.anim.setDuration(7000)
        self.anim.setStartValue(QPointF(0, 0))
        self.anim.setEndValue(QPointF(200, 200))
        self.anim.start()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Sample()
    sys.exit(app.exec_())
如果没有发布所有以前的尝试,则每个尝试都会失败,并出现不同的错误。我在一个小部件上得到了一个淡出动画来工作,还有一张沿着路径的图片,但我似乎可以让一个简单的线条画工作起来。我希望实现这样的目标:

文档是巨大的,似乎有几种方法来实现这一点,画家和计时器,动画,动画,但我不太熟悉C++,而且翻译到Python并不总是容易的。而且样品也不那么容易找到

我错过了什么明显的东西吗

谢谢


记录在案,这是我迄今为止所取得的成就,但只要我对QPropertyImation创建取消评论,应用程序就不会启动。无论如何,我还是远远没有得到公认的答案

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys

class MyLine(QGraphicsLineItem, QObject):
    def __init__(self):
        super().__init__()

    def _set_start(self, point):
        self.setLine(point.x(), point.y(), self.line().p2().x(), self.line().p2().y())

    def _set_end(self, point):
        self.setLine(self.line().p1().x(), self.line().p1().y(), point.x(), point.y())

    start = pyqtProperty(QPointF, fset=_set_start)
    end = pyqtProperty(QPointF, fset=_set_end)


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        hbox = QHBoxLayout(self)

        self.button = QPushButton("Start", self)
        self.button.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        hbox.addWidget(self.button)

        hbox.addSpacing(40)

        self.line = MyLine()
        self.line.setLine(0, 0, 10, 10)
        scene = QGraphicsScene()
        scene.addItem(self.line)
        view = QGraphicsView(scene)
        hbox.addWidget(view)

        self.anim = QPropertyAnimation(self.line, b"end") # crash without error here
        # self.anim.setDuration(2500)
        # self.anim.setLoopCount(1)
        # self.anim.setStartValue(QPointF(10, 10))
        # self.anim.setEndValue(QPointF(200, 200))
        # self.button.clicked.connect(self.anim.start)

        self.setGeometry(300, 300, 380, 250)
        self.setWindowTitle('Color anim')
        self.show()


if __name__ == "__main__":

    app = QApplication([])
    ex = Example()
    ex.show()
    app.exec_()

您必须将QGraphicsView、QGraphicscene与QGraphicsLineItem一起使用,如下所示:

从PyQt5导入QtCore、QtGui、qtwidget
类线性化(QtCore.QObject):
def uuu init uuu(self,parent=None):
超级(线性化,自).\u初始化\u(父级)
self.m_line=QtCore.QLineF()
self.m_item=QtWidgets.QGraphicsLineItem()
self.m_item.setLine(self.m_行)
self.m_item.setPen(
QtGui.QPen(
QtGui.QColor(“鲑鱼”),
10,
QtCore.Qt.SolidLine,
QtCore.Qt.SquareCap,
QtCore.Qt.RoundJoin,
)
)
self.m_动画=QtCore.QPropertyAnimation(
自己
b“p2”,
父母=自己,
startValue=QtCore.QPointF(0,0),
endValue=QtCore.QPointF(200200),
持续时间=5*1000,
)
self.m_animation.start()
def p1(自我):
返回self.m_line.p1()
def设置p1(自身,p1):
自m_线设置p1(p1)
self.m_item.setLine(self.m_行)
def p2(自我):
返回self.m_line.p2()
def设置p2(自身,p2):
self.m_line.setP2(p2)
self.m_item.setLine(self.m_行)
p1=QtCore.pyqtProperty(QtCore.QPointF,fget=p1,fset=setP1)
p2=QtCore.pyqtProperty(QtCore.QPointF,fget=p2,fset=setP2)
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
场景=qtwidts.qgraphicscene(self)
视图=QtWidgets.QGraphicsView(
场景,对齐=QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop
)
self.setCentralWidget(视图)
line_动画=线性化(自)
scene.addItem(line_animation.m_项)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 调整大小(640480)
w、 show()
sys.exit(app.exec_())

就是这样。非常感谢。我慢慢地开始朝着正确的方向走(请参见编辑),但离你的答案还很远。@supafly PyQt在QObject和QGraphicsItem的情况下不允许双重继承(在某些情况下,QObject中只允许双重继承),因此其程序失败,因此他使用了组合而不是继承