Qt 我们能在同一类型上使用两次寄存器插值器吗

Qt 我们能在同一类型上使用两次寄存器插值器吗,qt,Qt,在我的窗口中,我一方面在一个“按钮”内增加一个文本,另一方面减少另一个。(在两个不同的动画中,而不是在同一时间) 为此,我需要使用qRegisterAnimationInterpolator(myFontInterpolator)两次 但当我使用以下代码时: QVariant myFontInterpolator(const QFont &start, const QFont &end, qreal progress) { if (progress<0.5)

在我的窗口中,我一方面在一个“按钮”内增加一个文本,另一方面减少另一个。(在两个不同的动画中,而不是在同一时间)

为此,我需要使用
qRegisterAnimationInterpolator(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);
}

如果您有相同的问题,以下是解决方案:

创建一个类,该类子类
QPropertyAnimation
并重写
interpolated
。 在构建器中使用与相同的参数,并添加一个(enum或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;
};

如果您想实现这一点,您应该将
QVariantAnimation
QPropertyAnimation
子类化(如果您处理的是properteis和重新实现方法)。我不能同时将QObject和QPropertyAnimation子类化。我得到了以下错误:“QObject”是“MyButton”/“MyTextOk”的一个模棱两可的基,创建一个新类,子类
QPropertyImation
和重写
interpolated
与调用myFontInterpolator有什么区别?我还能做一次吗?(一次表示每次都是相同的动画)可以设置一个标志,该标志将决定如何计算插值。然后你可以两者都用。我在代码中实现这个新类时遇到了困难。我是否必须在我的生成器中调用
qRegisterAnimationInterpolator(插值)
?我在执行此操作时遇到了一系列错误,包括
没有匹配的函数调用'qRegisterAnimationInterpolator()'
变量'QFont rt'具有初始值设定项,但类型不完整
#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)
    }
};
#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();