Qt动画框架使用
前言
最近在考虑上位机的问题,在使用纯Qt + C++ + OpenCV和使用OpenCV + C# 中徘徊,但最后考虑到我不太会C#,就选择了Qt,因此怎么也该来学习学习了。
本文算是一篇转载文章。
原文点这里。

Qt Animation Framework继承体系
Qt有一套专门的动画框架,其继承体系如下图。

Qt动画框架基石由QAbstractAnimation以及它的两个子类QVariantAnimation和QAnimationGroup组成。QAbstractAnimation类是所有动画类的祖先。它包含了一些在框架中被普遍使用的基本功能;尤其是启动、停止和暂停动画功能。它也接收定时触发通知。
Qt动画框架更是提供了QPropertyAnimation类,该类继承于QVariantAnimation类,用于对Qt属性的动画操作(Qt属性系统是Qt元对象系统的一部分)。QPropertyAnimation类使用缓和曲线算法对属性进行插值演化操作。因此当你想动画改变一个值时,你就声明该值为一个属性值并且使该类为成为一个QObject对象。这给我们提供了很大的方便性去动画操作现有的部件和其他的QObject对象。
复杂动画可以通过构建QAbstractAnimation树形结构来构造。该树主要使用QAnimationGroup,QAnimationGroup类是一个包含其他动画类的容器类;同时QAnimationGroup类也是QAbstractAnimation类的子类,因此一个容器可以包含其他容器。
Qt动画框架既是独立的一部分,也是Qt状态机框架的一部分。Qt状态机框架提供一个状态用来行使动画。当QState进入或者退出时可以改变属性,当这个动画状态提供了一个QPropertyAnimatio时,则动画状态即在这些值之间进行插值衍化操作。
| QAbstractAnimation | 所有动画类的基类 |
|---|---|
| QAnimationGroup | 动画容器类的抽象基类 |
| QEasingCurve | 动画控制的缓和曲线类 |
| QParallelAnimationGroup | 并行动画容器 |
| QPauseAnimation | QSequentialAnimationGroup对象暂停延迟 |
| QPropertyAnimation | Qt动画属性操作 |
| QSequentialAnimationGroup | 串行动画容器 |
| QTimeLine | 动画控制的时间片类 |
| QVariantAnimation | 动画类的抽象基类 |
Qt动画属性
正如上述所提到的,QPropertyAnimation类能够修改Qt属性值。正是该类用于改变动画属性值;事实上,它的基类QVariantAnimation是一个抽象类,所以QVariantAnimation不能被直接使用。
我们选用Qt动画属性的一个主要原因是由于它给了我们很大的自由性去动画操作已经存在的类,尤其是拥有bounds、colors等属性的QWidget类(QWidget能被嵌入到QGraphicsView类)。我们看看一个小例子:
void QtWidgetsApplication1::on_btn_clicked()
{
QPropertyAnimation* animation = new QPropertyAnimation(ui.label, "geometry");
animation->setDuration(10000);
animation->setStartValue(QRect(0, 0, 200, 200));
animation->setEndValue(QRect(500, 500, this->width(), this->height()));
animation->start();
}
这段代码使按钮被按下后,\(label\)从\((0,0)\)在10秒内移动到了\((500,500)\)
注意:在我测试的过程中,发现只有指针形式的调用才能实现次效果
也可以做到类似CSS中的@keyframe效果,例如:
void QtWidgetsApplication1::on_btn_clicked()
{
QPropertyAnimation* animation = new QPropertyAnimation(ui.label, "geometry");
animation->setDuration(10000);
animation->setKeyValueAt(0, QRect(0, 0, 500, 500));
animation->setKeyValueAt(0.5, QRect(250, 250, 500, 500));
animation->setKeyValueAt(1.0, QRect(0, 0, 500, 500));
animation->start();
}
而在自定义动画属性时,必须使用宏Q_PROPERTY设置访问与设置的函数,这样才能正确使用。例如:
class MyGraphicsRectItem : public QObject, public QGraphicsRectItem
{
Q_OBJECT
Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)
};

浙公网安备 33010602011771号