【二-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