您好,登錄后才能下訂單哦!
這篇“Qt如何實現邊加載數據邊顯示頁面”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Qt如何實現邊加載數據邊顯示頁面”文章吧。
想要一打開頁面就加載數據,我們需要重寫QWidget::show(),開啟定時器,并且要立即執行。
//.h #include <QTimer> QTimer *m_Timer; //.cpp使用 m_Timer = new QTimer(this); connect(m_Timer, &QTimer::timeout, this, &QMyWidget::OnTimerLoadData);
void QMyWidget::show() { QWidget::show(); m_timer->start(0); }
打開頁面需要立即執行定時器操作,此時start中的參數=0,表示立即執行。
此時,顯示頁面已經加載出來了。
因為前面說過了,頁面的數據量比較多,不可能顯示頁面之后處于假死的狀態,那么,我們需要加載頁面的同時,顯示一個gif的等待圖標。
這里,我們就需要修改一下show()的函數
void QMyWidget::show() { QWidget::show(); //頁面啟動后,直接顯示加載gif圖片 gPageManager::instance()->GetDownloadDlg()->SetShowMode(1); gPageManager::instance()->GetDownloadDlg()->SetTips("正在加載案例數據,請稍后..."); gPageManager::instance()->GetDownloadDlg()->show(); if (m_timer->isActive() == false) { m_timer->start(0); } }
這里,我用了一個單例類:gPageManager調用具有gif效果圖的窗口。
這種方式就可以實現,顯示頁面以后,直接等待數據加載,防止我們看到假死頁面,給用戶造成困惱。
這里的gif圖片是用一個QLabel承載顯示的,方法很多,不過多介紹。
這里提醒的是:在使用QT中的定時器,比較安全的做法是,判斷該定時是否處于活躍狀態,只有再非活躍狀態下才需要觸發。這里只做溫馨提示哦,個人代碼習慣而已~
當進入定時器之后,進行數據處理。為了防止頁面卡頓,此時,在定時器中我們也要重新開啟一個線程,用于數據加載。
此時,就會有人想問,當前頁面已經開啟了一個定時器,為什么還要再創建一個線程呢?
下面我會一一解答的。
在C語言的函數中,運行指定函數中的內容時,只有運行到"}"時,才會顯示運行頁面。在某個特定的具體處理函數中計算機在處理時屬于一個過程處理函數。
所以,才會在一顯示頁面就開啟定時器操作,首先將頁面展示給用戶,在做其他的數據處理。
那么為什么要在定時器中再開一個線程呢?
主要是因為在show函數中調用了一個動態加載的窗口,假設定時器中直接加載較多數據時,此時,界面也會處于一個卡頓狀態,導致GIF等待窗口被卡住。為了防止這種情況出現,我們需要在定時器中繼續開一個線程,防止頁面卡頓。
void QMyWidget::OnTimerLoadData() { //因為只是在打開頁面時加載數據,所以,定時器只需要進行一次即可。 m_Timer->stop(); //啟動線程,加載數據,具體代碼這里不具體說明。 //數據加載完之后,隱藏GIF動態加載頁面 gPageManager::instance()->GetDownloadDlg()->hide(); }
到這里,打開頁面直接顯示加載的功能已經完成了,那么該如何實現當前線程呢?
接下來,是我們第二個階段的內容了~
一般C++的程序員在遇到這種情況時,通常很自然的就想要了,使用線程的方式。
其實,我第一個思路也是使用線程加載數據。但是使用線程必須要考慮到線程存在的弊端,比如說死鎖,比如說出現野指針等問題。
在QT中有一種開線程的方式,簡單容易上手,這里我還是比較推薦使用的:QtConcurrent::run
該函數的具體講解這里不做講解,我們直接使用吧!
首先需要的頭文件:
#include <QtConcurrent/QtConcurrentRun>
接下來是調用方式,這里我們定義加載數據的函數名叫做LoadWidgetData()
QFuture<bool> futureResult = QtConcurrent::run(this, &QMyWidget::LoadWidgetData); while (!futureResult.isFinished()) { QApplication::processEvents(QEventLoop::AllEvents); }
使用這種線程方式的時候,需要注意了,LoadWidgetData函數的返回值一定是true才可以
bool QMyWidget::LoadWidgetData() { //具體的數據加載操作 return true; }
線程的加載方式已經介紹完了,到這里,我們已經可以實現一遍加載數據,一遍顯示等待GIF效果了。
接下來,我們該實現如何實時呈現加載進度了~
大家都知道,在QT的線程中是無法調用頁面操作內容的。
一般情況下的頁面操作,比如窗口創建、控件賦值等等都需要在主線程進行,否則會造成崩潰問題。具體原因大家可以查閱資料去。
那么,我們要實現邊加載數據邊在頁面上展示的時候,該如何操作呢?
在這里,我們可以用發消息的方式,在線程中發送消息給主進程,交給主進程處理頁面操作
bool QMyWidget::LoadWidgetData() { //1:加載數據內容1,具體實現不說明 //發送數據內容1對應的頁面處理操作 emit Msg_SendSelfDataProcessing1(); //...數據加載內容自由發揮,類似于 上面兩步驟內容 return true; }
代碼看起來很好理解,這種方式既保證了數據加載流暢,也不對主頁面造成卡頓現象。
以上就是關于“Qt如何實現邊加載數據邊顯示頁面”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。