QT自定义QTextEdit实现大数据的实时刷新显示功能实例
作者:疯狂的挖掘机 发布时间:2023-05-06 03:18:28
前言
最近使用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、需要需要优化的部分翻页功能应该让右侧滑动条到最上或者最下自动去加载数据,可能体验更好;
来源:https://blog.csdn.net/ljsant/article/details/124962859


猜你喜欢
- public static string Escape(string s) &nb
- 苹果的iphone 有语音识别用的是Google 的技术,做为Google 力推的Android 自然会将其核心技术往Android 系统里
- 这篇文章主要介绍了dotnet core链接mongodb代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 本篇文章主要介绍泛型的应用。泛型是.NET work 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性、类型安全性和效
- 用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before、@Around和@After等advice。最近,
- 本文实例为大家分享了unity实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下首先创建一个头部,编写脚本利用WASD控制头部的移动。Vec
- 先给大家看下效果图:MenuPopwindow:package com.cloudeye.android.cloudeye.view;imp
- 这篇文章主要介绍了Java多线程的临界资源问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 目录前言hibernate-validator基本使用引入依赖编写需要验证对象验证对象属性是否符合要求验证规则空/非空验证bool时间数学字
- 本文实例为大家分享了C#用NPOI导出导入Excel帮助类的具体代码,供大家参考,具体内容如下1、准备工作在管理NuGet程序包中搜索 NP
- 大家好,我是狸小华,萌汉子一枚。今天给大家带来的是仿微信/支付宝的密码输入框。这个效果也出来有一段时间了,所以搜索一下还是有不少的网友实现,
- Android 读取资源文件实例详解本文主要介绍 Android 读取资源文件,直接从 assets 读取,从 Raw 文件中读取,Inpu
- 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件
- c# chart缩放,局部放大效果:左键划选放大区域,右键恢复 /// <sum
- DeferredResult的超时处理,采用委托机制,也就是在实例DeferredResult时给予一个超时时长(毫秒),同时在onTime
- 最近由于项目需要把不同格式的视频转换为ts流,故研究了一下ffmpeg。在网上找了很多资料,主要参考了Java+Windows+ffmpeg
- 传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets
- @Transactional是我们在用Spring时候几乎逃不掉的一个注解,该注解主要用来声明事务。它的实现原理是通过Spring AOP在
- 基于unity3D实现渐变颜色的简单脚本,代码很少,就不废话了,直接上代码和效果图。效果图:using System;using Syste
- Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。下面