Qt动画类 QPropertyAnimation

Qt动画类 QPropertyAnimation_第1张图片

动画框架基础由基类QAbstractAnimation以及它的两个子类QVariantAnimation、QAnimationGroup组成。QAbstractAnimation是所有动画的祖先。它包含了一些在框架中被普遍使用的基本功能,尤其是启动、停止和暂停动画功能,它也接收定时触发通知。

Qt动画框架更是提供了QPropertyAnimation类,该类继承自QVariantAnimation,用于对Qt属性的动画操作(Qt属性系统是Qt元对象系统的一部分)。QPropertyAnimation类使用缓和曲线算法对属性进行插值演化操作。因此当你想使用动画改变一个值时,需要声明其为一个属性并且使该类继承自QObject。这给我们提供了很大的方便性,去动画操作现有的部件和其它的QObject对象。

复杂动画可以通过构建QAbstractAnimation树形结构来构造。该树主要使用QAnimationGroup,QAnimationGroup类是一个包含其它动画类的容器类;同时QAnimationGroup类也是QAbstractAnimation类的子类,因此一个容器可以包含其它容器。

Qt动画框架可以独立使用,但是也被设计为Qt状态机框架的一部分。状态机框架提供一个特殊的状态用来播放动画。当状态进入或者退出时,QState也可以改变属性。当这个动画状态提供了一个QPropertyAnimatio时,这个特殊的状态会在这些值之间进行篡改操作。后续我们将了解的更加仔细。

在幕后,动画被一个全局定时器控制着,该定时器对所有正在运行的动画发送更新命令。

要了解Qt动画框架中各个类的功能,请参考相应的类描述信息。


原文链接:https://blog.csdn.net/liang19890820/article/details/51850579

Qt动画类 QPropertyAnimation_第2张图片

 

通过学习可以知道 QPropertyAnimation 类 需要设置属性:
常见的属性有:

 #pos---位置动画---QPoint
 #size---大小动画---QSize
 #geometry----位置+大小动画----QRect
 #windowOpacity---窗口的透明度(0.0是透明的    1.0是不透明)---只适合顶层窗口,内嵌的子窗口无效

其实还有很多很多属性可以通过对目标对象进行以下代码知道,或者查阅帮助文档:

 int counts = this->metaObject()->propertyCount();
    for(int i =0; i< counts; i++)
    {
        qDebug()<<"property "<metaObject()->property(i).name();
    }

打印如下:

objectName

modal

windowModality

enabled

geometry

frameGeometry

normalGeometry

x

y

pos

frameSize

size

width

height

rect

childrenRect

childrenRegion

sizePolicy

minimumSize

maximumSize

minimumWidth

minimumHeight

maximumWidth

maximumHeight

sizeIncrement

baseSize

palette

font

cursor

mouseTracking

isActiveWindow

focusPolicy

focus

contextMenuPolicy

updatesEnabled

visible

minimized

maximized

fullScreen

sizeHint

minimumSizeHint

acceptDrops

windowTitle

windowIcon

windowIconText

windowOpacity

windowModified

toolTip

toolTipDuration

statusTip

whatsThis

accessibleName

accessibleDescription

layoutDirection

autoFillBackground

styleSheet

locale

windowFilePath

inputMethodHints

 

这些属性都可以为 QPropertyAnimation 初始化 属性。

-----------------------------------------分割线----------------------------------------

下面贴一个顶层窗口的关于透明度的动画代码:(顶层窗口有效,子窗口无效)

QPropertyAnimation *pAnimation = new QPropertyAnimation(this, "windowOpacity");
    pAnimation->setDuration(1000);
    pAnimation->setKeyValueAt(0, 1);
    pAnimation->setKeyValueAt(0.5, 0);
    pAnimation->setKeyValueAt(1, 1);
    pAnimation->start(QAbstractAnimation::DeleteWhenStopped);
如果是子窗口以上代码是无效的。

可以改为以下代码来实现(顶层窗口无效)

QGraphicsOpacityEffect *opacity = new QGraphicsOpacityEffect(this);
    opacity->setOpacity(1);
    setGraphicsEffect(opacity);
    QPropertyAnimation *animation = new QPropertyAnimation(this);
    animation->setDuration(4000);
    animation->setTargetObject(opacity);
    animation->setPropertyName("opacity");
    animation->setStartValue(1);
    animation->setKeyValueAt(0.8,1);
    animation->setEndValue(0);
    animation->start(QAbstractAnimation::DeleteWhenStopped);
    //animation->setEasingCurve(QEasingCurve::OutBounce); //设置节奏
    connect(animation,SIGNAL(finished()),this,SLOT(deleteLater()));

你可能感兴趣的:(QT基础知识)