c++ - 为什么不可能为 QPropertyAnimation 制作 qobject_cast
问题描述
这是 QPropertyAnimation 的创建代码:
void CustomGraphicsScene::addAnimation(AnimatedPixmapItem* item)
{
auto propertyAnimation = new QPropertyAnimation { item, "SpriteFrame" };
connect(propertyAnimation, &QPropertyAnimation::destroyed, this, &CustomGraphicsScene::deleteAnimation);
propertyAnimation->setDuration(1000);
propertyAnimation->setStartValue(0);
propertyAnimation->setEndValue(10);
propertyAnimation->start(QAbstractAnimation::DeleteWhenStopped);
}
这是插槽,我正在尝试投射 QPropertyAnimation:
void CustomGraphicsScene::deleteAnimation()
{
auto propertyAnimation = qobject_cast<QPropertyAnimation*>(sender());
if (propertyAnimation) { // Always false
// Some code
}
}
解决方案
qobject_cast
不仅进行强制转换,而且还使用 QMetaObject 验证 QObject 是否仍然存在,例如,如果您propertyAnimation->metaObject()->className();
在构建对象时打印它将返回QPropertyAnimation
,但在与销毁sender()->metaObject()->className()
返回关联的插槽中QObject
。
我的建议是使用finished,更改删除策略并在槽中删除。
void CustomGraphicsScene::addAnimation(AnimatedPixmapItem* item)
{
auto propertyAnimation = new QPropertyAnimation { item, "SpriteFrame" };
connect(propertyAnimation, &QPropertyAnimation::finished, this, &CustomGraphicsScene::finishAnimation);
propertyAnimation->setDuration(1000);
propertyAnimation->setStartValue(0);
propertyAnimation->setEndValue(10);
propertyAnimation->start(QAbstractAnimation::KeepWhenStopped);
}
void CustomGraphicsScene::finishAnimation()
{
auto propertyAnimation = qobject_cast<QPropertyAnimation*>(sender());
if (propertyAnimation) { // Always false
// Some code
propertyAnimation->deleteLater();
}
}
推荐阅读
- ssl - Hyperledger Fabric(第一个应用程序)+ Hyperledger Explorer 错误
- javascript - 访问占位符文本以开玩笑验证
- sql - 根据单元格位置从excel批量插入到sql中的选择性字段
- r - 根据 r 中的条件进行整形
- javascript - 在 THREE.js 中为螺旋星系生成粒子
- javascript - HTML5 Canvas ~ 缩放并保持当前 Canvas 相对偏移量(视口中心点)
- asp.net-core - 无法编辑实体对象 asp.net
- nginx - 使用 XSLT 的 Nginx 自动索引
- node.js - 任何项目文件夹外的多个目录中的 node_modules
- regex - 重命名文件Powershell,无法重命名文件不存在