首页 > 解决方案 > 为什么不可能为 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
        }
    }

标签: c++qt

解决方案


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();
    }
}

推荐阅读