Qt实现窗口关闭动画效果

现在很多软件在窗口状态切换的时候都会带那么一些小动画,看起来还挺酷的。比如程序退出的时候,有些软件会展现一个 窗口合拢的效果;比如QQ贴边隐藏、展现会有一个滑出滑入的动画效果,如果要我们自己实现也可以,就是动态改变窗口大小和位置嘛,但效率如何就不敢保证啦。还好Qt早就为我们准备了这么一个动画框架:QAbstractAnimation.
这个抽象类被 QAnimationGroup, QPauseAnimation, and QVariantAnimation这3个类继承,第一个主要是完成动画的并行播放,第二个是为并行播放提供单个动画的暂停,第三个是提供任意Variant类型的动画效果,它被QPropertyAnimation继承。完成窗口关闭动画效果只要用这个类就行了。

下面说一下实现流程:
首先当窗口关闭的时候会接收到一个closeEvent,当我们截获到这个closeEvent的时候就要播放关闭动画,当动画播放完毕,我们就关闭窗口,代码如下:

void StyledWindow::playCloseAnimation()
{
    setMinimumSize(0,0);
    QPropertyAnimation* closeAnimation = new QPropertyAnimation(this,"geometry");
    closeAnimation->setStartValue(geometry());
    closeAnimation->setEndValue(QRect(geometry().x(),geometry().y()+height()/2,width(),0));
    closeAnimation->setDuration(300);
    closeAnimationState = hasplayed;
    connect(closeAnimation,SIGNAL(finished()),this,SLOT(close()));
    closeAnimation->start(QAbstractAnimation::DeleteWhenStopped);

}

void StyledWindow::closeEvent(QCloseEvent *event)
{
    if(isPlayCloseAnimation && closeAnimationState == notplay){
        playCloseAnimation();
        event->ignore();
    }
    else{
        event->accept();
    }
}

第一行是为了防止窗口设置了最小值,改变不了大小!这要注意一下!
我把playCloseAnimation()弄成了虚函数,这样继承这个类的时候只要重新实现虚函数就可以完成不一样的关闭动画,无需再重写closeEvent().
但是注意了,这段代码仅对无边框的窗口有效,如果你的窗口不是无边框的那么需要改变的是frameGeometry属性,但是这个属性只有读函数,没有写函数,你必须自己实现一个写函数,然后利用Q_Property宏声明一下才行,详细的请查询 Q_Property System

Guess you like

Origin blog.csdn.net/qq_16952303/article/details/52016474