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

主要功能介紹:
1、這里用一個(gè)6M多的文件加一個(gè)定時(shí)器100ms模擬實(shí)時(shí)數(shù)據(jù),可以 自定義保存多少數(shù)據(jù),默認(rèn)是保存10M數(shù)據(jù);
2、行號(hào)的顯示和隱藏;
3、右側(cè)滾動(dòng)條可以查看保存的數(shù)據(jù);
4、支持大數(shù)據(jù)的保存實(shí)時(shí)刷新。
一、 思路
QT自帶的QTextEdit在一次顯示K以上級(jí)別的還是可以的,但是一次性讀入上M數(shù)據(jù)基本上就會(huì)卡死,如果在實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù),這個(gè)控件基本不能使用(少量數(shù)據(jù)是可以的)。目前的思路是分頁顯示:

上述自定義的TextEdit其實(shí)由1、QTextEdit(作為行號(hào))+2、QTextEdit(主內(nèi)容)+3、scrollbar組成拼接的一個(gè)UI。
1、1和2自動(dòng)顯示的水平和豎直的滾動(dòng)條,將3滾動(dòng)條與其信號(hào)產(chǎn)生關(guān)聯(lián)(有信號(hào))
2、設(shè)置當(dāng)前顯示的區(qū)域的最大列數(shù)和每一行最大字節(jié)數(shù)(這樣就可以知道顯示多少字節(jié)數(shù)了);
3、設(shè)置一個(gè)緩存來存儲(chǔ)收到的內(nèi)容,示例用了一個(gè)10M的QString來存儲(chǔ)數(shù)據(jù),每次來數(shù)據(jù)就去偏移,這個(gè)緩存就是為了暫存。
4、顯示區(qū)域只顯示設(shè)置的最大列數(shù),實(shí)際設(shè)置為100列足夠占滿顯示區(qū)域每次點(diǎn)擊右側(cè)滾動(dòng)條最上或者最下小倒三角就自動(dòng)翻頁(翻頁的大小也是固定的,從緩存找相應(yīng)的位置)
所以說即使是6M數(shù)據(jù),顯示的只是最后100行數(shù)據(jù),在實(shí)時(shí)刷新的時(shí)候不會(huì)卡界面,如果想要查看之前的數(shù)據(jù),只需要向上翻頁,從緩存讀取顯示出來,用戶體驗(yàn)還是蠻好的。
二、關(guān)鍵部分代碼
1.緩存
這個(gè)緩存我想了很久,最后直接用一個(gè)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.滾動(dòng)部分代碼
代碼如下(示例):
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++));
}用了一個(gè)遞歸,感覺不是太好。
三、需要優(yōu)化的地方
1、因?yàn)楸4娴亩际菫镼String,實(shí)際過程可能char用的多,這個(gè)需要轉(zhuǎn)換,同時(shí)顯示HEx也需要轉(zhuǎn)換;
2、行號(hào)其實(shí)是有上限,這個(gè)上限就是最大容量除以每一行最大字節(jié)數(shù),但是沒有設(shè)置;
3、需要需要優(yōu)化的部分翻頁功能應(yīng)該讓右側(cè)滑動(dòng)條到最上或者最下自動(dòng)去加載數(shù)據(jù),可能體驗(yàn)更好;
總結(jié)
在實(shí)現(xiàn)功能之前,自己試驗(yàn)了好幾種方法,包括多線程,后來發(fā)現(xiàn)時(shí)頻繁的加載大數(shù)據(jù)界面才會(huì)卡死,UI交互部分在主線程操作,所以保證數(shù)據(jù)量在可視的范圍就好,無需一次加載太多數(shù)據(jù)。

QT是個(gè)好的ide,目前已經(jīng)6版本,支持更高級(jí)的C++和更好的特性,在應(yīng)用方面還需要自己更具實(shí)際需要好好的揣摩。
到此這篇關(guān)于QT自定義QTextEdit實(shí)現(xiàn)大數(shù)據(jù)的實(shí)時(shí)刷新顯示功能的文章就介紹到這了,更多相關(guān)QT自定義QTextEdit實(shí)時(shí)刷新顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CString,字符串,整數(shù)等相互轉(zhuǎn)換方法(推薦)
下面小編就為大家?guī)硪黄狢String,字符串,整數(shù)等相互轉(zhuǎn)換方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法
本文主要介紹了Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
c++重載運(yùn)算符時(shí)返回值為類的對(duì)象或者返回對(duì)象的引用問題
這篇文章主要介紹了c++重載運(yùn)算符時(shí)返回值為類的對(duì)象或者返回對(duì)象的引用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

