亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt實(shí)現(xiàn)邊加載數(shù)據(jù)邊顯示頁面的示例代碼

 更新時(shí)間:2022年01月25日 11:39:11   作者:中國好公民st  
無論是MFC框架還是QT框架,實(shí)現(xiàn)加載數(shù)據(jù)的等待效果都是很麻煩的,不像WEB端輕輕松松一句代碼就搞定了。本文將通過Qt實(shí)現(xiàn)邊加載數(shù)據(jù)邊顯示頁面的功能,需要的可以參考一下

做過C++開發(fā)的人們都知道,無論是MFC框架還是QT框架,實(shí)現(xiàn)加載數(shù)據(jù)的等待效果都是很麻煩的,不像WEB端輕輕松松一句代碼就搞定了。而我們這些做C++的,最常用的方法就是開線程了。

剛開始,我也是采用的開線程的方式,但是,想象總是與事實(shí)相悖的。

假設(shè)頁面展示的數(shù)據(jù)比較多,導(dǎo)致加載頁面時(shí)間較長,用戶體驗(yàn)度很差,點(diǎn)擊了觸發(fā)按鈕之后很長時(shí)間才會(huì)有響應(yīng),總讓人誤會(huì)程序死機(jī)了,但真正的原因是數(shù)據(jù)正在加載。

那么,當(dāng)前頁面展示的數(shù)據(jù)量較多,我們?cè)撊绾蝿?dòng)態(tài)的顯示邊加載數(shù)據(jù)邊顯示頁面呢?

對(duì)于我這種剛從MFC框架轉(zhuǎn)過來的新手來說,確實(shí)是一個(gè)不小的挑戰(zhàn)呢!

那么,我來講解下我是如何實(shí)現(xiàn)的吧!

1.定義顯示定時(shí)器

想要一打開頁面就加載數(shù)據(jù),我們需要重寫QWidget::show(),開啟定時(shí)器,并且要立即執(zhí)行。

1:定義定時(shí)器

//.h
#include <QTimer>

QTimer *m_Timer;

//.cpp使用
m_Timer = new QTimer(this);
connect(m_Timer, &QTimer::timeout, this, &QMyWidget::OnTimerLoadData);

2:定時(shí)器調(diào)用

void QMyWidget::show()
{
    QWidget::show();
    m_timer->start(0);
}

打開頁面需要立即執(zhí)行定時(shí)器操作,此時(shí)start中的參數(shù)=0,表示立即執(zhí)行。

此時(shí),顯示頁面已經(jīng)加載出來了。

因?yàn)榍懊嬲f過了,頁面的數(shù)據(jù)量比較多,不可能顯示頁面之后處于假死的狀態(tài),那么,我們需要加載頁面的同時(shí),顯示一個(gè)gif的等待圖標(biāo)。

這里,我們就需要修改一下show()的函數(shù)

void QMyWidget::show()
{
    QWidget::show();
    //頁面啟動(dòng)后,直接顯示加載gif圖片
    gPageManager::instance()->GetDownloadDlg()->SetShowMode(1);
    gPageManager::instance()->GetDownloadDlg()->SetTips("正在加載案例數(shù)據(jù),請(qǐng)稍后...");
    gPageManager::instance()->GetDownloadDlg()->show();
    if (m_timer->isActive() == false)
    {
        m_timer->start(0);    
    }
}

這里,我用了一個(gè)單例類:gPageManager調(diào)用具有g(shù)if效果圖的窗口。

這種方式就可以實(shí)現(xiàn),顯示頁面以后,直接等待數(shù)據(jù)加載,防止我們看到假死頁面,給用戶造成困惱。

這里的gif圖片是用一個(gè)QLabel承載顯示的,方法很多,不過多介紹。

這里提醒的是:在使用QT中的定時(shí)器,比較安全的做法是,判斷該定時(shí)是否處于活躍狀態(tài),只有再非活躍狀態(tài)下才需要觸發(fā)。這里只做溫馨提示哦,個(gè)人代碼習(xí)慣而已~

3:定時(shí)器加載數(shù)據(jù)

當(dāng)進(jìn)入定時(shí)器之后,進(jìn)行數(shù)據(jù)處理。為了防止頁面卡頓,此時(shí),在定時(shí)器中我們也要重新開啟一個(gè)線程,用于數(shù)據(jù)加載。

此時(shí),就會(huì)有人想問,當(dāng)前頁面已經(jīng)開啟了一個(gè)定時(shí)器,為什么還要再創(chuàng)建一個(gè)線程呢?

下面我會(huì)一一解答的。

在C語言的函數(shù)中,運(yùn)行指定函數(shù)中的內(nèi)容時(shí),只有運(yùn)行到"}"時(shí),才會(huì)顯示運(yùn)行頁面。在某個(gè)特定的具體處理函數(shù)中計(jì)算機(jī)在處理時(shí)屬于一個(gè)過程處理函數(shù)。

所以,才會(huì)在一顯示頁面就開啟定時(shí)器操作,首先將頁面展示給用戶,在做其他的數(shù)據(jù)處理。

那么為什么要在定時(shí)器中再開一個(gè)線程呢?

主要是因?yàn)樵趕how函數(shù)中調(diào)用了一個(gè)動(dòng)態(tài)加載的窗口,假設(shè)定時(shí)器中直接加載較多數(shù)據(jù)時(shí),此時(shí),界面也會(huì)處于一個(gè)卡頓狀態(tài),導(dǎo)致GIF等待窗口被卡住。為了防止這種情況出現(xiàn),我們需要在定時(shí)器中繼續(xù)開一個(gè)線程,防止頁面卡頓。

void QMyWidget::OnTimerLoadData()
{
    //因?yàn)橹皇窃诖蜷_頁面時(shí)加載數(shù)據(jù),所以,定時(shí)器只需要進(jìn)行一次即可。
    m_Timer->stop();
    
    //啟動(dòng)線程,加載數(shù)據(jù),具體代碼這里不具體說明。
    
    //數(shù)據(jù)加載完之后,隱藏GIF動(dòng)態(tài)加載頁面
    gPageManager::instance()->GetDownloadDlg()->hide();
}

到這里,打開頁面直接顯示加載的功能已經(jīng)完成了,那么該如何實(shí)現(xiàn)當(dāng)前線程呢?

接下來,是我們第二個(gè)階段的內(nèi)容了~

2.線程加載數(shù)據(jù)

一般C++的程序員在遇到這種情況時(shí),通常很自然的就想要了,使用線程的方式。

其實(shí),我第一個(gè)思路也是使用線程加載數(shù)據(jù)。但是使用線程必須要考慮到線程存在的弊端,比如說死鎖,比如說出現(xiàn)野指針等問題。

在QT中有一種開線程的方式,簡(jiǎn)單容易上手,這里我還是比較推薦使用的:QtConcurrent::run

該函數(shù)的具體講解這里不做講解,我們直接使用吧!

首先需要的頭文件:

#include <QtConcurrent/QtConcurrentRun>

接下來是調(diào)用方式,這里我們定義加載數(shù)據(jù)的函數(shù)名叫做LoadWidgetData()

QFuture<bool> futureResult = QtConcurrent::run(this, &QMyWidget::LoadWidgetData);
while (!futureResult.isFinished())
{
    QApplication::processEvents(QEventLoop::AllEvents);
}

使用這種線程方式的時(shí)候,需要注意了,LoadWidgetData函數(shù)的返回值一定是true才可以

bool QMyWidget::LoadWidgetData()
{
    //具體的數(shù)據(jù)加載操作
    return true;
}

線程的加載方式已經(jīng)介紹完了,到這里,我們已經(jīng)可以實(shí)現(xiàn)一遍加載數(shù)據(jù),一遍顯示等待GIF效果了。

接下來,我們?cè)搶?shí)現(xiàn)如何實(shí)時(shí)呈現(xiàn)加載進(jìn)度了~

3.實(shí)時(shí)呈現(xiàn)加載進(jìn)度

大家都知道,在QT的線程中是無法調(diào)用頁面操作內(nèi)容的。

一般情況下的頁面操作,比如窗口創(chuàng)建、控件賦值等等都需要在主線程進(jìn)行,否則會(huì)造成崩潰問題。具體原因大家可以查閱資料去。

那么,我們要實(shí)現(xiàn)邊加載數(shù)據(jù)邊在頁面上展示的時(shí)候,該如何操作呢?

在這里,我們可以用發(fā)消息的方式,在線程中發(fā)送消息給主進(jìn)程,交給主進(jìn)程處理頁面操作

bool QMyWidget::LoadWidgetData()
{
    //1:加載數(shù)據(jù)內(nèi)容1,具體實(shí)現(xiàn)不說明
    
    //發(fā)送數(shù)據(jù)內(nèi)容1對(duì)應(yīng)的頁面處理操作
    emit Msg_SendSelfDataProcessing1();
    
    //...數(shù)據(jù)加載內(nèi)容自由發(fā)揮,類似于 上面兩步驟內(nèi)容
    
    return true;
}

代碼看起來很好理解,這種方式既保證了數(shù)據(jù)加載流暢,也不對(duì)主頁面造成卡頓現(xiàn)象。

到此這篇關(guān)于Qt實(shí)現(xiàn)邊加載數(shù)據(jù)邊顯示頁面的示例代碼的文章就介紹到這了,更多相關(guān)Qt內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • EasyX實(shí)現(xiàn)自由落體小球

    EasyX實(shí)現(xiàn)自由落體小球

    這篇文章主要為大家詳細(xì)介紹了EasyX實(shí)現(xiàn)自由落體小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 在C語言編程中使用變量的基礎(chǔ)教程

    在C語言編程中使用變量的基礎(chǔ)教程

    這篇文章主要介紹了在C語言編程中使用變量的基礎(chǔ)教程,特別需要注意C語言中的指針變量,需要的朋友可以參考下
    2016-02-02
  • C語言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能

    C語言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了C語言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++ primer類的基礎(chǔ)精講

    C++ primer類的基礎(chǔ)精講

    C++類,是指系統(tǒng)在第一次在程序中遇到一個(gè)類時(shí)為這個(gè)類建立它的所有類變量的拷貝 - 這個(gè)類的所有實(shí)例共享它的類變量
    2022-07-07
  • C語言 遞歸解決青蛙跳臺(tái)階問題

    C語言 遞歸解決青蛙跳臺(tái)階問題

    遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。基本含義&#8203;是指函數(shù)/過程/子程序在運(yùn)行過程序中直接或間接調(diào)用自身而產(chǎn)生的重入現(xiàn)象。在計(jì)算機(jī)編程里,遞歸指的是一個(gè)過程:函數(shù)不斷引用自身,直到引用的對(duì)象已知
    2021-11-11
  • 使用dc畫筆畫矩形、直線與橢圓示例

    使用dc畫筆畫矩形、直線與橢圓示例

    這篇文章主要介紹了使用dc畫筆畫矩形、直線與橢圓示例,需要的朋友可以參考下
    2014-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析

    C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中二分查找遞歸非遞歸實(shí)現(xiàn)并分析的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C語言全面細(xì)致精講操作符的使用

    C語言全面細(xì)致精講操作符的使用

    C?語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們?cè)敿?xì)了解掌握它
    2022-05-05
  • C語言strlen函數(shù)全方位講解

    C語言strlen函數(shù)全方位講解

    在C語言中我們要獲取字符串的長度,可以使用strlen函數(shù),strlen函數(shù)計(jì)算字符串的長度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)?nbsp;strlen函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用strlen函數(shù)計(jì)算的字符串的長度會(huì)比使用sizeof計(jì)算的字符串的字節(jié)數(shù)要小
    2022-09-09
  • C語言超詳細(xì)講解文件的操作

    C語言超詳細(xì)講解文件的操作

    C語言文件操作的方法有很多,函數(shù)也有很多你知道哪些呢?下面是小編為大家?guī)淼腃語言文件操作的方法,歡迎閱讀
    2022-04-04

最新評(píng)論