【二-2-1】Qt 图形视图框架——图形视图框架中实现动画效果的几种方式


 

1、使用 QGraphicsItemAnimation 类(已过时)

1.1)使用示例:

 1 void MainWindow::sl_addAnimationAct()
 2 {
 3     //connect(timeline,SIGNAL(frameChanged(int)),yourobj,SLOT(yourobjslot(int))); // 每次变帧都会发送信号
 4     //setUpdateInterval(int interval)   // 该函数用于控制更新动画的时间间隔
 5 
 6     StarItem *star = new StarItem; // 自定义的继承自 QGraphicsItem 的图元
 7     star->setPos(-200, 0); //【起点】
 8 
 9     QTimeLine *timeLine = new QTimeLine(4000);    // 动画持续时间 Tad 。
10     //timeLine->setCurveShape(QTimeLine::SineCurve); // Tad 内, 以正弦速移帧, 即先正向变速移动, 再反向变速移动
11     timeLine->setCurveShape(QTimeLine::LinearCurve); // Tad 内, 以线速移帧, 即平稳向前移动到终点
12     timeLine->setLoopCount(0);    // 循环次数, 0 为无限循环
13     timeLine->setFrameRange(0, 100); // 帧范围
14 
15     QGraphicsItemAnimation *anima = new QGraphicsItemAnimation;
16     anima->setItem(star);
17     anima->setTimeLine(timeLine);
18     //================↓
19 #if 0
20     int y =(qrand()%400)-200;
21     for(int i=0;i<400;i++)
22     {
23         //anima->setPosAt(i/400.0,QPointF(i-200,y));
24         anima->setPosAt(1,QPointF(i-200,y));
25     }
26 #endif
27     anima->setPosAt(0.9, QPointF(200, 0)); //【终点】, 0.9 为驻留比例, 即运动时间 = Tad * 0.9, 到达终点时驻留时间 = Tad * (1 - 0.9)
28     //================↑
29     timeLine->start();
30 
31     scene->addItem(star);
32 }

 

2、使用 QGraphicsObject 的子类

2.1)从上图的继承关系可以看出,QGraphicsObject 为图形项(QGraphicsItem)继承了一个 QObject 基类,从而使图形项可以使用 QObject 的信号、槽以及属性。

2.2)使用示例:参考这一篇第3点 Qt 动画框架基础 - 编译器有自己的想法 - 博客园 (cnblogs.com)

 

3、使用 QGraphicsWidget 的子类

3.1)使用示例:

 1 #include <QApplication>
 2 #include <QGraphicsScene>
 3 #include <QGraphicsView>
 4 #include <QGraphicsItem>
 5 #include <QGraphicsProxyWidget>
 6 #include <QGraphicsWidget>
 7 #include <QGraphicsLinearLayout>
 8 
 9 #include <QTextEdit>
10 #include <QPushButton>
11 #include <QObject>
12 
13 int main(int argc, char *argv[])
14 {
15     QApplication a(argc, argv);
16 
17     QGraphicsScene scene;
18 
19     QTextEdit *ted = new QTextEdit;
20     QPushButton *pbt = new QPushButton(QObject::tr("clear"));
21     QObject::connect(pbt, &QPushButton::clicked, ted, &QTextEdit::clear);
22 
23     QGraphicsWidget *g_ted = scene.addWidget(ted);
24     QGraphicsWidget *g_pbt = scene.addWidget(pbt);
25 
26     QGraphicsLinearLayout *gll = new QGraphicsLinearLayout;
27     gll->addItem(g_ted);
28     gll->addItem(g_pbt);
29 
30     QGraphicsWidget *form = new QGraphicsWidget;
31     form->setWindowFlags(Qt::Window);
32     form->setWindowTitle(QObject::tr("QGraphicsWidget"));
33     form->setLayout(gll);
34     form->setTransform(QTransform().shear(2, -0.5), true);
35 
36     scene.addItem(form);
37 
38     QGraphicsView view(&scene);
39     view.setRenderHint(QPainter::HighQualityAntialiasing);
40     view.show();
41 
42     return a.exec();
43 }

 

4、使用 QGrapicsScene::advance() 函数和 QGraphicsItem::advance(int phase)函数

4.1)调用场景的 advance 函数就会自动调用场景中所有图形项的 advance 函数。

4.2)图形项的 advance 函数会分阶段调用两次,第一次 phase 为 0 ,告知所有图形项场景即将改变;第二次 phase 为 1,进行动画操作。

4.3)使用示例(待续)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM