QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時刷新顯示功能實(shí)例
前言
最近使用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語言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))
魔方陣是指由1,2,3……n2填充的,每一行、每一列、對角線之和均相等的方陣,階數(shù)n = 3,4,5…。魔方陣也稱為幻方陣,看下面的實(shí)現(xiàn)方法吧2013-11-11Qt學(xué)習(xí)筆記之QPalette調(diào)色板類
這篇文章主要為大家詳細(xì)介紹了Qt學(xué)習(xí)筆記之QPalette調(diào)色板類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07使用C++一步步實(shí)現(xiàn)俄羅斯方塊后續(xù)
本文主要給大家分享的是作者在使用C++制作俄羅斯方塊小游戲的時候所需要的常用的函數(shù),有需要的小伙伴可以借鑒下,希望大家能夠喜歡。2017-12-12C語言模擬內(nèi)存函數(shù)分析之mencpy與memmove
這篇文章主要介紹了C語言詳解如何模擬內(nèi)存函數(shù),用到了mencpy與memmove兩個函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03