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

为什么对QPropertyAnimation执行qobject_cast操作始终返回false

问题原因分析

Qt中QObject的destroyed信号是在对象析构流程的中间阶段触发的:C++类析构执行顺序是从最派生类往基类逐层执行,当destroyed信号被emit时,目标对象的派生类部分(此处为QPropertyAnimation、QVariantAnimation、QAbstractAnimation的自定义成员和虚表)已经被析构回收,此时对象的动态类型已经退化为QObject,因此依赖动态类型信息的qobject_cast无法识别到原有的QPropertyAnimation类型,判断自然始终为false。

解决方案
  • 方案1:替换绑定的信号为QAbstractAnimation::finished
    动画正常结束时finished信号会先于析构流程触发,此时QPropertyAnimation对象的完整类型信息还未被销毁,qobject_cast可以正常转换,完全满足业务逻辑处理需求,仅需修改连接逻辑即可:
    // 把原来绑定destroyed的行替换为下面的代码
    connect(propertyAnimation, &QAbstractAnimation::finished, this, &CustomGraphicsScene::deleteAnimation);
    
    你原本设置的DeleteWhenStopped标志不受影响,槽函数执行完成后动画对象会自动销毁。
  • 方案2:如果必须监听destroyed信号,不要尝试转换为派生类指针
    可以在创建动画时将需要用到的属性通过QObject::setProperty存入对象基础属性中,在destroyed触发时直接调用sender()->property()读取即可,不需要做类型转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:45:02