QT中的動畫機制

2021-10-02 18:35:02 字數 2779 閱讀 4762

目錄

一、qt框架中主要動畫類

二、各個類的主要作用

三、關於窗體的透明屬性

四、qt框架的動畫的一些弊端

1、qpropertyanimation

該類為屬性動畫類,顧名思義,qt的動畫是基於窗體的某個屬性,對該屬性進行相應的變化來使得窗體動起來。同時,在運用動畫時必要的步驟便是為某個窗體繫結一種動畫。

舉個栗子,比如widget窗體的屬性geometry,該屬性用於控制窗體在螢幕上的顯示位置,該屬性有4個引數,分別為x,y,w,h。即窗體在螢幕上的(x,y)座標點以及窗體的初始化寬和高,當窗體的座標點發生變化,而寬,高不變時,即可看到平移的動畫效果;當加入寬高元素變化時,例如寬高由0變化至窗體正常大小時,即可看到縮放的動畫效果。

qpropertyanimation* pscaleanimation = new qpropertyanimation(ui->widget, "geometry");

pscaleanimation->setduration(1000);

pscaleanimation->setstartvalue(qrect(1920 / 2, 1080 / 2, 0, 0));

pscaleanimation->setendvalue(qrect(0, 0, 1920, 1080));

pscaleanimation->seteasingcurve(qeasingcurve::inoutquad);

以上**實現了窗體的縮放動畫,首先new乙個屬性動畫類,並將widget繫結於該動畫,且繫結屬性為「geometry」;其次規定該動畫的持續時間,單位為ms;然後規定動畫的起始座標以及結束座標;最後為該動畫選擇一種運動型別,qt官方提供了很多種不同的插值曲線來簡化動畫的製作,例如加速、減速、彈跳等插值曲線,來讓整個動畫框架顯得更加完善。具體可參考官方文件中描述來選擇自己所需要的動畫曲線,官方文件鏈結為:

2、qsequentialanimationgroup

該類為序列動畫組。當我們不滿足於單一的縮放、平移效果,想擁有類似於android平台的動畫特效時,便需要用到序列動畫組,通過將各個屬性動畫加入到該序列動畫組中,依據加入動畫組中的先後順序,便可以呈現出更為複雜而有趣的動畫,例如縮放展開動畫+平移動畫+縮放消失動畫整個流暢的過程。但要注意的是對於序列動畫組來說,在同一時間,只能有乙個窗體的動畫在執行,因為其為「序列」。

qsequentialanimationgroup* pscalegroup = new qsequentialanimationgroup(this);

pscalegroup->addanimation(pscaleanimation1);

pscalegroup->addanimation(pscaleanimation2);

pscalegroup->addanimation(pscaleanimation3);

以上**展示了如何將已定義好的屬性動畫加入到序列動畫組中。

3、qparallelanimationgroup

該類為並行動畫組。很多時候我們想要的動畫也並不是單一的同一時間只能看到乙個窗體動來動去,我們希望能夠像android平台那樣豐富而又絢麗的多窗體動畫,那麼這個時候就需要用到該類了。通過將屬性動畫或者甚至是序列動畫組加入到並行動畫組中,我們便可以得到更加複雜,且窗體不限的動畫效果,這個時候,在同一時間,便可以有多個窗體進行動畫的展示。

qparallelanimationgroup* m_group;

m_group = new qparallelanimationgroup(this);

m_group->addanimation(pscalegroup);

以上**展示了如何將已定義好的序列動畫組加入到並行動畫組中。

4、動畫的執行

qparallelanimationgroup* m_group;

m_group->setdirection(qabstractanimation::forward);

m_group->setloopcount(1);

m_group->start();

以上**展示了如何讓動畫動起來。

透明屬性需要另外的類參與來設定。

qgraphicsopacityeffect* pwidgetopacity = new qgraphicsopacityeffect(this);

pwidgetopacity->setopacity(1);

widget->setgraphicseffect(pwidgetopacity);

qpropertyanimation* popacityanimation = new qpropertyanimation(pwidgetopacity, "opacity");

popacityanimation->setduration(s_time * 1000);

popacityanimation->setstartvalue(1);

popacityanimation->setendvalue(0);

popacityanimation->seteasingcurve(qeasingcurve::linear);

以上**實現了對窗體的透明度的屬性的繫結以及由不透明到透明的漸變動畫。

另外,在動畫中難免不了對一些座標進行計算以及控制,這些點都十分麻煩以及繁瑣,最近也採用了狀態機的方式來製作動畫,有時間再對狀態機機制進行一些彙總,個人用起來感覺利用狀態機來製作類似android的動畫會比較簡單方便,但是狀態機的動畫效果仍然有很多地方不方便。

QT中的事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...

Qt中的事件機制

什麼是自發事件?哪些型別的事件可以被propagated 或compressed?posting and sending 事件之間有何不同?什麼時候應該呼叫 accept 或是ignore 如果這些問題你還不是很了解,那麼繼續看下去。事件起源 定製事件型別 到現在為至,我們所說的內容不僅僅適用於ke...

Qt中實現啟動畫面

縱所周之,當乙個程式的啟動比較耗時的時候,為了不讓使用者枯燥的等待或者是誤以為程式執行異常了,所以我們都會在啟動比較耗時的程式中加上啟動介面 例如office軟體等等。在qt中實現啟動介面,主要就是使用qsplashscreen類。該模擬較簡單,這裡就不對類本身做過多說明了,主要是以乙個例子來說明他...