使用QPropertyAnimation的线动画

2024-09-29 21:34:20 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试使用PyQt5并使用QPropertyAnimation设置从零到(0,0)到(200,200)线的动画。我已经阅读了很多关于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_())

没有发布所有以前的尝试,每个尝试都会以不同的错误失败。我在一个小部件上得到了一个淡出动画来工作,一张图片沿着一条路径,但我似乎可以使一个简单的线条画工作。我希望能取得这样的成就:

Codepen example

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

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

谢谢!在


据我所知,这是我迄今为止所取得的成就,但一旦我取消对QPropertyAnimation创建的评论,app就不会启动。不管怎么说,我离被接受的答案还差得很远。在

^{pr2}$

Tags: from文档importselfappdefsys动画
1条回答
网友
1楼 · 发布于 2024-09-29 21:34:20

您必须使用QGraphicsView、qgraphicscene和QGraphicsLineItem,如下所示:

from PyQt5 import QtCore, QtGui, QtWidgets


class LineAnimation(QtCore.QObject):
    def __init__(self, parent=None):
        super(LineAnimation, self).__init__(parent)
        self.m_line = QtCore.QLineF()
        self.m_item = QtWidgets.QGraphicsLineItem()
        self.m_item.setLine(self.m_line)
        self.m_item.setPen(
            QtGui.QPen(
                QtGui.QColor("salmon"),
                10,
                QtCore.Qt.SolidLine,
                QtCore.Qt.SquareCap,
                QtCore.Qt.RoundJoin,
            )
        )

        self.m_animation = QtCore.QPropertyAnimation(
            self,
            b"p2",
            parent=self,
            startValue=QtCore.QPointF(0, 0),
            endValue=QtCore.QPointF(200, 200),
            duration=5 * 1000,
        )
        self.m_animation.start()

    def p1(self):
        return self.m_line.p1()

    def setP1(self, p1):
        self.m_line.setP1(p1)
        self.m_item.setLine(self.m_line)

    def p2(self):
        return self.m_line.p2()

    def setP2(self, p2):
        self.m_line.setP2(p2)
        self.m_item.setLine(self.m_line)

    p1 = QtCore.pyqtProperty(QtCore.QPointF, fget=p1, fset=setP1)
    p2 = QtCore.pyqtProperty(QtCore.QPointF, fget=p2, fset=setP2)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        scene = QtWidgets.QGraphicsScene(self)
        view = QtWidgets.QGraphicsView(
            scene, alignment=QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop
        )
        self.setCentralWidget(view)

        line_animation = LineAnimation(self)
        scene.addItem(line_animation.m_item)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

相关问题 更多 >

    热门问题