Qt实现动画QPropertyAnimation类

        在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(); 等方法来控制动画

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值