欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時刷新顯示功能實(shí)例

 更新時間:2022年05月27日 16:06:11   作者:瘋狂的挖掘機(jī)  
TextEdit是我們常用的Qt控件,用來顯示文本信息,下面這篇文章主要給大家介紹了關(guān)于QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時刷新顯示功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

最近使用QT中的QTextEdit控件,作為實(shí)時數(shù)據(jù)顯示的UI,在一次寫入超過多少k的時候循環(huán)寫入則會卡頓,網(wǎng)上也沒有什么好的解決方案,左思右想自己實(shí)現(xiàn)一個類似的demo。后期封裝起來繼承QWidget就可以在其他地方應(yīng)用,直接上圖:

主要功能介紹:

1、這里用一個6M多的文件加一個定時器100ms模擬實(shí)時數(shù)據(jù),可以 自定義保存多少數(shù)據(jù),默認(rèn)是保存10M數(shù)據(jù);

2、行號的顯示和隱藏;

3、右側(cè)滾動條可以查看保存的數(shù)據(jù);

4、支持大數(shù)據(jù)的保存實(shí)時刷新。

一、 思路

QT自帶的QTextEdit在一次顯示K以上級別的還是可以的,但是一次性讀入上M數(shù)據(jù)基本上就會卡死,如果在實(shí)時監(jiān)測數(shù)據(jù),這個控件基本不能使用(少量數(shù)據(jù)是可以的)。目前的思路是分頁顯示:

上述自定義的TextEdit其實(shí)由1、QTextEdit(作為行號)+2、QTextEdit(主內(nèi)容)+3、scrollbar組成拼接的一個UI。

1、1和2自動顯示的水平和豎直的滾動條,將3滾動條與其信號產(chǎn)生關(guān)聯(lián)(有信號)

2、設(shè)置當(dāng)前顯示的區(qū)域的最大列數(shù)和每一行最大字節(jié)數(shù)(這樣就可以知道顯示多少字節(jié)數(shù)了);

3、設(shè)置一個緩存來存儲收到的內(nèi)容,示例用了一個10M的QString來存儲數(shù)據(jù),每次來數(shù)據(jù)就去偏移,這個緩存就是為了暫存。

4、顯示區(qū)域只顯示設(shè)置的最大列數(shù),實(shí)際設(shè)置為100列足夠占滿顯示區(qū)域每次點(diǎn)擊右側(cè)滾動條最上或者最下小倒三角就自動翻頁(翻頁的大小也是固定的,從緩存找相應(yīng)的位置)

所以說即使是6M數(shù)據(jù),顯示的只是最后100行數(shù)據(jù),在實(shí)時刷新的時候不會卡界面,如果想要查看之前的數(shù)據(jù),只需要向上翻頁,從緩存讀取顯示出來,用戶體驗(yàn)還是蠻好的。

二、關(guān)鍵部分代碼

1.緩存

這個緩存我想了很久,最后直接用一個QString來做

代碼如下(示例):

  mwarehouse.fill(QChar(),10*1024*1024);

移位部分代碼

void MainWindow::setDataToHouse(QString &str)
{
    int Maxsize = mwarehouse.size();
    if(str.size()>=Maxsize)
    {
        mwarehouse= str;
        return;
    }
    QString test = mwarehouse.mid(str.size(),-1);
    mwarehouse.replace(0,Maxsize-str.size(),mwarehouse.mid(str.size(),-1));
    mwarehouse.replace(Maxsize-str.size(),str.size(),str);
}

2.滾動部分代碼

代碼如下(示例):

void MainWindow::showScrollContent(bool up)
{
    int Maxsize = mwarehouse.size();
    uint tmpsize = getScrollshowAreaSize();
    uint cursize = mtextedit->toPlainText().size();
    if(up)
    {
        if(cyclesnum<mlinenum){return;}
        mupnum+=tmpsize;
        cyclesnum-=  (mlinenum*2-1);
    }
    else{
        if(mupnum<tmpsize)
        {
           mupnum=0 ;
           return;
        }
        mupnum-=cursize;
    }
    QString allowString = mwarehouse.mid(Maxsize-tmpsize-mupnum,tmpsize);
    showString(allowString);
}

3.根據(jù)每一行最大字節(jié)數(shù)顯示數(shù)據(jù)

void MainWindow::showString(QString mess,bool cyc )
{
        if(cyc)
        {
            uint cycles = (mess.size())/(mlinenumsize);
            qDebug()<<"!!!!!"<<cycles;
            if(cycles>0)
            {
                for (uint i = 0;i<cycles ;++i ) {
                    showAllString(mess.mid(i*mlinenumsize,mlinenumsize));
                }
                mess = mess.mid(cycles*mlinenumsize,mess.size()-cycles*mlinenumsize);
            }
        }
        mtextedit->append(mess);
        ui->tb_linenum->append(QString::number(cyclesnum++));
}

用了一個遞歸,感覺不是太好。

三、需要優(yōu)化的地方

1、因?yàn)楸4娴亩际菫镼String,實(shí)際過程可能char用的多,這個需要轉(zhuǎn)換,同時顯示HEx也需要轉(zhuǎn)換;

2、行號其實(shí)是有上限,這個上限就是最大容量除以每一行最大字節(jié)數(shù),但是沒有設(shè)置;

3、需要需要優(yōu)化的部分翻頁功能應(yīng)該讓右側(cè)滑動條到最上或者最下自動去加載數(shù)據(jù),可能體驗(yàn)更好;

總結(jié)

在實(shí)現(xiàn)功能之前,自己試驗(yàn)了好幾種方法,包括多線程,后來發(fā)現(xiàn)時頻繁的加載大數(shù)據(jù)界面才會卡死,UI交互部分在主線程操作,所以保證數(shù)據(jù)量在可視的范圍就好,無需一次加載太多數(shù)據(jù)。

QT是個好的ide,目前已經(jīng)6版本,支持更高級的C++和更好的特性,在應(yīng)用方面還需要自己更具實(shí)際需要好好的揣摩。

到此這篇關(guān)于QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時刷新顯示功能的文章就介紹到這了,更多相關(guān)QT自定義QTextEdit實(shí)時刷新顯示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 十個C++惡搞朋友的代碼合集

    十個C++惡搞朋友的代碼合集

    這篇文章主要為大家整理了十個C++中可以惡搞朋友的代碼合集(注意!從第五個開始為危險/永久性程序,請慎重使用),感興趣的小伙伴可以收藏一下
    2023-02-02
  • C語言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))

    C語言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))

    魔方陣是指由1,2,3……n2填充的,每一行、每一列、對角線之和均相等的方陣,階數(shù)n = 3,4,5…。魔方陣也稱為幻方陣,看下面的實(shí)現(xiàn)方法吧
    2013-11-11
  • C++ 實(shí)現(xiàn)高性能HTTP客戶端

    C++ 實(shí)現(xiàn)高性能HTTP客戶端

    HttpClient可以實(shí)現(xiàn)所有HTTP的方法,通過API傳輸接收HTTP消息。本文詳細(xì)講解了HttpClient,以及如何運(yùn)用C++實(shí)現(xiàn)HTTP客戶端,感興趣的朋友可以參考一下
    2021-08-08
  • Qt學(xué)習(xí)筆記之QPalette調(diào)色板類

    Qt學(xué)習(xí)筆記之QPalette調(diào)色板類

    這篇文章主要為大家詳細(xì)介紹了Qt學(xué)習(xí)筆記之QPalette調(diào)色板類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 使用C++一步步實(shí)現(xiàn)俄羅斯方塊后續(xù)

    使用C++一步步實(shí)現(xiàn)俄羅斯方塊后續(xù)

    本文主要給大家分享的是作者在使用C++制作俄羅斯方塊小游戲的時候所需要的常用的函數(shù),有需要的小伙伴可以借鑒下,希望大家能夠喜歡。
    2017-12-12
  • QT使用QChart繪制柱狀圖

    QT使用QChart繪制柱狀圖

    在Qt中使用QChart類可以快速繪制一個圖表出來,比如折線圖、餅圖、柱狀圖等,本文就來為大家介紹一下如何利用QChart繪制簡單的柱狀圖吧
    2024-11-11
  • C++無符號整數(shù)溢出問題解析

    C++無符號整數(shù)溢出問題解析

    這篇文章主要介紹了C++無符號整數(shù)溢出探究,本文主要探討C/C++中無符號整數(shù)超過范圍后的計(jì)算問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c++string字符串的比較是否相等問題

    c++string字符串的比較是否相等問題

    這篇文章主要介紹了c++string字符串的比較是否相等問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言模擬內(nèi)存函數(shù)分析之mencpy與memmove

    C語言模擬內(nèi)存函數(shù)分析之mencpy與memmove

    這篇文章主要介紹了C語言詳解如何模擬內(nèi)存函數(shù),用到了mencpy與memmove兩個函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • c++使用正則表達(dá)式提取關(guān)鍵字的方法

    c++使用正則表達(dá)式提取關(guān)鍵字的方法

    這篇文章給大家介紹了c++使用正則表達(dá)式提取關(guān)鍵字的方法,相對來說比較簡單,同時給大家提到了c++通過正則表達(dá)式提取匹配到的字符串的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08

最新評論