为什么对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
相关产品推荐
相关产品推荐

