Qt 从动画中删除键值

Qt remove a key value from an animation

我正在使用 Qt 的 Python 绑定来开发应用程序。 我通过设置自定义键值制作了一个非线性动画, 正如 Qt docs 中所说:

It is also possible to set values situated between the start and end value. The interpolation will then go by these points.

QPushButton button("Animated Button");
button.show();

QPropertyAnimation animation(&button, "geometry");
animation.setDuration(10000);

animation.setKeyValueAt(0, QRect(0, 0, 100, 30));
animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));
animation.setKeyValueAt(1, QRect(0, 0, 100, 30));

animation.start();

目标

我更新我的动画值并在几个部分中使用它,有时我想让它成为线性的。

问题

我找不到删除动画的设置关键值以使其线性化的方法。我尝试为我的动画设置“startValue”“endValue”,但它们只是替换了默认动画键值(0.0 和 1.0),而我之前设置的自定义键值将保留在那里。下面是示例代码:

import sys

from PyQt5.QtCore import QRect, QPoint, QPropertyAnimation, QParallelAnimationGroup
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFrame


class Form(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.resize(600, 400)
        self.setWindowTitle("Form 1")
        self.frame = QFrame(self)
        self.frame.resize(200, 150)
        self.frame.move(20, 20)
        self.setStyleSheet("""QFrame {
            background-color: orange;
        }""")
        self.button = QPushButton("Start Animation", self)
        self.button.resize(self.button.sizeHint())
        self.button.move(20, 300)
        self.define_animation()
        self.button.clicked.connect(self.frame_anim.start)
        self.show()

    def define_animation(self):
        self.frame_anim = QPropertyAnimation(self.frame, b"geometry")
        self.frame_anim.setDuration(1000)
        self.frame_anim.setStartValue(self.frame.geometry())
        self.frame_anim.setKeyValueAt(0.75, QRect(QPoint(20, 100), self.frame.size()))
        self.frame_anim.setKeyValueAt(1, QRect(QPoint(380, 220), self.frame.size()))
        self.frame_anim.finished.connect(lambda: print("ََAnimation key values", self.frame_anim.keyValues()))
        self.frame_anim.finished.connect(self.define_new_animation)

    def define_new_animation(self):
        self.frame_anim.setStartValue(QRect(QPoint(380, 220), self.frame.size()))
        self.frame_anim.setEndValue(QRect(QPoint(20, 220), self.frame.size()))


app = QApplication(sys.argv)
form = Form()
sys.exit(app.exec_())

第一个动画是非线性的,我设置了自定义键值,但下一个将保留该键值。 我正在寻找一种解决方案,以从动画中删除设置的键值,或在设置自定义键值后使其线性化的任何逻辑方法。

setStartValuesetEndValue都不会“清除”当前动画,只会设置new开始和beginnig的状态,同时离开所有其他嵌套对象。

为了更新当前动画并重置其所有关键点,您需要使用 setKeyValues() 和空映射来清除现有映射。

这是一个可能的解决方案:

class Form(QMainWindow):

    # ...

    def define_new_animation(self):
        self.frame_anim.setKeyValues({})
        self.frame_anim.setStartValue(
            QRect(QPoint(380, 220), self.frame.size()))
        self.frame_anim.setEndValue(
            QRect(QPoint(20, 220), self.frame.size()))