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