我们可以在同一类型上使用两次寄存器插补器

时间:2017-06-30 06:39:07

标签: qt

在我的窗口中,我一方面在"按钮"内部生成文本,另一方面减少另一个文本。 (在两个不同的动画中,不是在同一时间)

为此,我需要使用qRegisterAnimationInterpolator<QFont>(myFontInterpolator)两次。

但是当我使用以下代码时:

QVariant myFontInterpolator(const QFont &start, const QFont &end, qreal progress)
{
    if (progress<0.5)
    {
        int a = (1-progress)*25 + progress*30;
        QFont rt(start);
        rt.setPointSize(a);
        return rt;
    }
    else
    {
        int a = (1-progress)*30 + progress*25;
        QFont rt(start);
        rt.setPointSize(a);
        return rt;
    }
        Q_UNUSED(end)
}

MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
    //some code
    qRegisterAnimationInterpolator<QFont>(myFontInterpolator);
}

QVariant myFontInterpolator2(const QFont &start, const QFont &end, qreal progress)
{
    if (progress<0.5)
    {
        int a = (1-progress)*50 + progress*45;
        QFont rt(start);
        rt.setPointSize(a);
        return rt;
    }
    else
    {
        int a = (1-progress)*45 + progress*50;
        QFont rt(start);
        rt.setPointSize(a);
        return rt;
    }
        Q_UNUSED(end)
}

MyTextOk::MyTextOk(QGraphicsObject *parent)
    : QObject(parent), QGraphicsSimpleTextItem(parent)
{
    // some code
    qRegisterAnimationInterpolator<QFont>(myFontInterpolator2);
}

myFontInterpolator2的来电会删除myFontInterpolator的来电,只要我的&#34; changePolicySizeAnimation&#34;是相同的。

有没有办法保留两者?或者我必须写一个适用于两者的那个吗?

编辑:这是我的班级MyVariantFont(见here

#include <QPropertyAnimation>
#include <QFont>

class myVariantFont : public QPropertyAnimation
{
public:
    explicit myVariantFont();
    ~myVariantFont();

private :
    QVariant interpolated(const QVariant &start, const QVariant &end, qreal progress) const
    {
        if (progress<0.5)
        {
            int a = (1-progress)*25 + progress*30;
            QFont rt(start);
            rt.setPointSize(a);
            return rt;
        }
        else
        {
            int a = (1-progress)*30 + progress*25;
            QFont rt(start);
            rt.setPointSize(a);
            return rt;
        }
            Q_UNUSED(end)
    }
};

1 个答案:

答案 0 :(得分:1)

如果您遇到同样的问题,可以使用以下解决方案:

创建一个子类QPropertyAnimation并覆盖interpolated的类。 在构建器中使用与QPropertyAnimation's相同的参数,并添加一个(枚举或bool),以便您进行正确的转换。

调用动画时,只需调用新类而不是QPropertyAnimation,如下所示:

#include <QPropertyAnimation>
#include <QFont>

class myVariantFont : public QPropertyAnimation
{
public:
    explicit myVariantFont(QObject *target, const QByteArray &propertyName, bool choose)
    {
        choice = choose;
    }

    ~myVariantFont();

private :
    QVariant interpolated(const QVariant &start, const QVariant &end, qreal progress) const
    {
        if (choice == false)
        {
            if (progress<0.5)
            {
                int a = (1-progress)*25 + progress*30;
                QFont rt(start.value<QFont>());
                rt.setPointSize(a);
                return rt;
            }
            else
            {
                int a = (1-progress)*30 + progress*25;
                QFont rt(start.value<QFont>());
                rt.setPointSize(a);
                return rt;
            }
        }
        else
        {
            if (progress<0.5)
            {
                int a = (1-progress)*50 + progress*45;
                QFont rt(start.value<QFont>());
                rt.setPointSize(a);
                return rt;
            }
            else
            {
                int a = (1-progress)*45 + progress*50;
                QFont rt(start.value<QFont>());
                rt.setPointSize(a);
                return rt;
            }
        }
            Q_UNUSED(end)
    }

protected :
    bool choice;
};

myVariantFont *animation = new myVariantFont(textOk,"font", true);

animation->setDuration(300);
animation->setStartValue(QFont("Colibri",50));
animation->setEndValue(QFont("Colibri",50));

animation->start();