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)使用示例(待续)