首頁 > 軟體

QT自定義QTextEdit實現巨量資料的實時重新整理顯示功能範例

2022-05-27 18:06:55

前言

最近使用QT中的QTextEdit控制元件,作為實時資料顯示的UI,在一次寫入超過多少k的時候迴圈寫入則會卡頓,網上也沒有什麼好的解決方案,左思右想自己實現一個類似的demo。後期封裝起來繼承QWidget就可以在其他地方應用,直接上圖:

主要功能介紹:

1、這裡用一個6M多的檔案加一個定時器100ms模擬實時資料,可以 自定義儲存多少資料,預設是儲存10M資料;

2、行號的顯示和隱藏;

3、右側卷軸可以檢視儲存的資料;

4、支援巨量資料的儲存實時重新整理。

一、 思路

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

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

1、1和2自動顯示的水平和豎直的卷軸,將3卷軸與其訊號產生關聯(有訊號)

2、設定當前顯示的區域的最大列數和每一行最大位元組數(這樣就可以知道顯示多少位元組數了);

3、設定一個快取來儲存收到的內容,範例用了一個10M的QString來儲存資料,每次來資料就去偏移,這個快取就是為了暫存。

4、顯示區域只顯示設定的最大列數,實際設定為100列足夠佔滿顯示區域每次點選右側卷軸最上或者最下小倒三角就自動翻頁(翻頁的大小也是固定的,從快取找相應的位置)

所以說即使是6M資料,顯示的只是最後100行資料,在實時重新整理的時候不會卡介面,如果想要檢視之前的資料,只需要向上翻頁,從快取讀取顯示出來,使用者體驗還是蠻好的。

二、關鍵部分程式碼

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.根據每一行最大位元組數顯示資料

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++));
}

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

三、需要優化的地方

1、因為儲存的都是為QString,實際過程可能char用的多,這個需要轉換,同時顯示HEx也需要轉換;

2、行號其實是有上限,這個上限就是最大容量除以每一行最大位元組數,但是沒有設定;

3、需要需要優化的部分翻頁功能應該讓右側滑動條到最上或者最下自動去載入資料,可能體驗更好;

總結

在實現功能之前,自己試驗了好幾種方法,包括多執行緒,後來發現時頻繁的載入巨量資料介面才會卡死,UI互動部分在主執行緒操作,所以保證資料量在可視的範圍就好,無需一次載入太多資料。

QT是個好的ide,目前已經6版本,支援更高階的C++和更好的特性,在應用方面還需要自己更具實際需要好好的揣摩。

到此這篇關於QT自定義QTextEdit實現巨量資料的實時重新整理顯示功能的文章就介紹到這了,更多相關QT自定義QTextEdit實時重新整理顯示內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com