在我的窗口中,我一方面在"按钮"内部生成文本,另一方面减少另一个文本。 (在两个不同的动画中,不是在同一时间)
为此,我需要使用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)
}
};
答案 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();