在Qt中,如果想实现一个渐变的过程,比如逐渐移动按钮位置,逐渐改变对话框大小等。整体下来就像一个动画一样。
实现起来有2种方式,自己造轮子,使用Qt提供的类库。
1、手动实现动画
使用QTimer定时器,来手动改变。每次超时触发timeout信号时,在槽函数中手动改变。
QPushButton* btn = new QPushButton();
QTimer *timer = new QTimer();
connect(timer,&QTimer::timeout,this,&MainWindow::updateBtn);
timer->start(50);
void updateBtn()
{
int width = btn->width();
if(width>500)
{
timer->stop();
return;
}
btn->setWidth(width+20);
}
每次出发超时,调大按钮宽度20,当按钮宽度大于500时,停止计时器。
可以用bool变量控制定时器的开关。
可以再写一个宽度变小的计时器。
除了调用设置宽度接口,还可以调佣其它任何可以调用的接口。比如移动位置move、设置样式、设置文本等。
2、使用QPropertyAnimation类
QPropertyAnimation
是 Qt 框架中一个非常强大的类,它允许开发者对 QObject
或其派生类的任何可读写属性进行动画处理,从而创建平滑、连续的动画效果,例如控件的位置、大小、颜色等属性的变化
可读写属性如下,在Qt的帮助文档,输入类型搜索。当前类没有可以在父类搜索。
(1)设置需要动画的控件,动画属性
(2)设置动画持续时间
(3)设置起始值
(4)设置结束值
(5)开启动画
#include <QApplication>
#include <QPushButton>
#include <QPropertyAnimation>
{
QPushButton button("Click me!");
button.resize(100, 40);
button.move(50, 50); // 设置初始位置
// 创建 QPropertyAnimation 对象
QPropertyAnimation *animation = new QPropertyAnimation(&button, "pos");
animation->setDuration(1000); // 设置动画持续时间为 1000 毫秒
animation->setStartValue(QPoint(50, 50)); // 设置起始位置
animation->setEndValue(QPoint(200, 50)); // 设置结束位置
animation->start(); // 启动动画
}
创建QPropertyAnimation对象时,构造函数参数:
第一个:需要动画的控件指针
第二个:上图属性图片,绿色的文字。
setStartValue函数参数需要,上图属性图片,绿色的文字后面的类型一致。
比如上例子使用的是pos,需要点QPoint类型
如果需要对其他属性进行动画,可以对应写上。
如果需要自定义的属性,需要自定义属性
3、QParallelAnimationGroup多个动画同时设置
QPropertyAnimation *sizeAnimation = new QPropertyAnimation(button, "size");
QPropertyAnimation *colorAnimation = new QPropertyAnimation(button, "paletteBrush", "background");
sizeAnimation->setDuration(2000); // 动画持续2000毫秒
sizeAnimation->setStartValue(QSize(100, 40)); // 起始大小
sizeAnimation->setEndValue(QSize(200, 80)); // 结束大小
colorAnimation->setDuration(2000);
QColor startColor = Qt::red; // 起始颜色为红色
QColor endColor = Qt::blue; // 结束颜色为蓝色
colorAnimation->setStartValue(QBrush(startColor));
colorAnimation->setEndValue(QBrush(endColor));
QParallelAnimationGroup *group = new QParallelAnimationGroup;
group->addAnimation(sizeAnimation);
group->addAnimation(colorAnimation);
group->start(); // 开始动画
// 你可以使用 group->stop(); 或 group->pause(); 等方法来控制动画