QT專案 LoaddingWidget實現

2021-10-17 10:59:26 字數 2716 閱讀 6330

關於不使用qpropertyanimation

實際上,作為動畫,它的顯示必然是一幀一幀地顯示在電腦螢幕上的,只不過我們用**控制的時候,不是使用貼圖,而是通過我們計算去算出每一幀我們要如何繪製,然後通過時間更新每一幀要繪製的內容。

為了寫**的時候使得我們的物件有良好的復用性,方便通過繼承實現更多的擴充套件,我們需要了解到我們在實現載入動畫的時候需要怎麼一步步計算到每一幀繪製需要用到的資料。

下面是乙個簡單的載入動畫

首先,既然動畫是一幀一幀地繪製得到的,那麼對於幀序列來說我們需要三個東西

動畫時長

計時器每一幀需要的資料

動畫時長就是完成一次動畫需要的時間,這個時間,計時器用於更新圖畫,比如我要30ms更新一幀,那麼計時器每隔30ms就應該呼叫我的繪製函式去進行繪製。第一幀繪製第乙個心型為較深的灰色,那麼30s後第二幀就應該呼叫繪製函式繪製每二個心形為較深的灰色,第乙個相應地繪製比較淺一些。至於每一幀需要的資料,和上面載入動畫對應,就是繪製每乙個心形的位置和大小,也就是把心形包含起來的矩形對應的位置大小。

其次,我們希望繼承者能有更多的實現,那麼基類就只需要最基本的實現,並且為更多的擴充套件提供介面。

就如上面所說一樣,動畫總是避免不了動畫時長、重新整理時間、進度資料,繪製資料等,那麼我們將這些需要的資料封裝起來,並且提供給派生類,由派生類根據這些資料去實現具體每一幀的顯示。但是由於不同的動畫需要進行的繪製資料是不同的,因此我們只是將資料保留在基類中,然後由派生類設定具體每幀中的繪製資料是什麼。

那麼基類的類定義如下

class

baseloadingwidget

:public qwidget

// 動畫是否已經被啟用

public slots:

void

start()

;// 開始動畫

void

stop()

;// 結束動畫

void

updateframerate()

;// 更新動畫重新整理率,動畫重新整理率與螢幕重新整理率一致

protected

:inline qeasingcurve easingcurve()

inline

intframecount()

inline qreal refreshtime()

inline

intduration()

inline

intextendframecount()

// 獲取某幀需要的繪製資訊

inline qrect framerect

(const

int& index)

inline

bool

stoploading()

// 設定某幀的繪製資訊

inline

void

setframerect

(const

int& index,

const qrect& rect)

// 停止計時器

inline

void

stopanimationtimer()

// 獲取某一幀時的值

inline qreal framevalue

(const

int& index)

return0;

}// 計算每幀需要的繪製資訊,在呼叫updateframedata後會觸發此函式

virtual

void

updateframerects()

=0;// 重新整理幀,即每次重新整理幀都會呼叫此函式

virtual

void

updateframe()

=0;signals:

void

loaddingstoped()

;// 載入動畫已經停止

private

:void

updateframevalues()

;private

: qeasingcurve m_curve;

// 插值器

qlist m_framerects;

// 每一幀需要的rect資料

qtimer* m_animationtimer;

// 用於控制動畫的計時器

int m_framerate;

// 幀率

int m_duration;

// 完成一次動畫需要的時間

int m_extendduration;

// 追擊延遲時間

int m_extendframecount;

// 追擊幀數

bool m_animationstop;

// 是否停止動畫

qlist m_framevalues;

// 每一幀對應的數值

};

派生類只需要根據基類提供的資料將上面的介面實現,設定要繪製的資料以及根據資料進行繪製,就能實現乙個自定義的載入動畫了。下面是乙個基礎的實現效果,模仿的是windows 10的橫向載入效果

一開始我也是想要通過qpropertyanimation去實現載入動畫效果的,但是qt5.15版本qpropertyanimation在父控制項運動過程中,會出現繪製殘缺的情況,運動速度越快這種情況就越明顯,因此放棄這種實現方式。另外也是想著能夠去做更多的嘗試。

QT新建專案

本文章 小韓同學 的csdn部落格 初始qt,在建立qt專案時系統提供了幾個不同的模板,點選模板,系統會自動為使用者建立好乙個基礎框架方便開發。這裡,我們試著不適用系統提供的基礎框架,自己建立乙個空的qt專案。qt blank project author hancq date 2016 08 05...

QT專案配置

路徑配置 工具 選項 構建和執行 確定 選擇當前目錄生成專案 新增qt原始碼 工具 選項 偵錯程式 新增qt原始碼 路徑5.9.6下的src檔案俠 ok qt的快捷方式 d qt tools qtcreator bin qtcreator.exe ifndef mainwindow h define...

QT專案打包

通常用qt完成乙個小專案之後預期要在不同的機器上執行 我們知道qt程式的編譯使用的是dyanmic linking,這些機器有的可能具備了專案執行所需的庫檔案,有的可能不具備。因此需要提前將專案所必需的庫檔案與專案資源檔案進行打包。qt提供了乙個執行上述操作的inte ce,在qt安裝目錄下乙個叫w...