You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Qt属性动画中移除自定义键值以切换为线性动画

问题根源

调用setStartValue()和setEndValue()时,只会修改动画键值列表中0和1两个步长点对应的值,不会清除之前设置的中间步长键值,因此原有非线性插值逻辑会保留。

解决方案

有两种常用实现方案,可根据场景选择:

方案1:直接覆盖键值列表(推荐,性能开销低)

QPropertyAnimation提供setKeyValues()方法可以直接覆盖整个键值列表,仅传入起止步长的键值对即可清除所有中间键值,实现线性动画:

def define_new_animation(self):
    # 覆盖键值列表,仅保留起止点,自动清除所有中间自定义键值
    self.frame_anim.setKeyValues({
        0: QRect(QPoint(380, 220), self.frame.size()),
        1: QRect(QPoint(20, 220), self.frame.size())
    })

修改后运行时打印keyValues()可以看到,原有0.75位置的中间键值已经被完全清除,动画变为线性插值。

方案2:重新实例化动画对象(逻辑直观,无状态残留)

如果后续动画参数调整较大,也可以直接销毁原有动画对象,创建新的实例,从根源避免状态残留:

def define_new_animation(self):
    # 销毁原有动画实例
    self.frame_anim.deleteLater()
    # 创建全新的线性动画
    self.frame_anim = QPropertyAnimation(self.frame, b"geometry")
    self.frame_anim.setDuration(1000)
    self.frame_anim.setStartValue(QRect(QPoint(380, 220), self.frame.size()))
    self.frame_anim.setEndValue(QRect(QPoint(20, 220), self.frame.size()))
    # 按需重新绑定信号槽即可

内容的提问来源于stack exchange,提问作者Parsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:45:10