您好,登錄后才能下訂單哦!
這篇“QT如何自定義QTextEdit實現大數據的實時刷新顯示功能”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“QT如何自定義QTextEdit實現大數據的實時刷新顯示功能”文章吧。
最近使用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行數據,在實時刷新的時候不會卡界面,如果想要查看之前的數據,只需要向上翻頁,從緩存讀取顯示出來,用戶體驗還是蠻好的。
這個緩存我想了很久,最后直接用一個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); }
代碼如下(示例):
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、需要需要優化的部分翻頁功能應該讓右側滑動條到最上或者最下自動去加載數據,可能體驗更好;
以上就是關于“QT如何自定義QTextEdit實現大數據的實時刷新顯示功能”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。