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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
JavaWeb Servlet生命周期细枝末节处深究
C#简单创建和删除目录的方法
C# WinForm创建Excel文件的实例
Java实现五子棋游戏
pom文件中${project.basedir}的使用
![](https://img.aspxhome.com/file/2023/4/63494_0s.jpg)
C#多线程处理多个队列数据的方法
C#使用log4net记录日志的方法步骤
![](https://img.aspxhome.com/file/2023/9/106449_0s.png)
MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)
![](https://img.aspxhome.com/file/2023/6/71856_0s.png)
Android 自定义组件成JAR包的实现方法
![](https://img.aspxhome.com/file/2023/0/102610_0s.png)
Java带复选框的树(Java CheckBox Tree)实现和应用
![](https://img.aspxhome.com/file/2023/1/119061_0s.jpg)
详解Java面向对象编程之多态
![](https://img.aspxhome.com/file/2023/8/86788_0s.png)
Java用freemarker导出word实用示例
![](https://img.aspxhome.com/file/2023/5/86715_0s.png)
SpringSecurity Jwt Token 自动刷新的实现
![](https://img.aspxhome.com/file/2023/2/71582_0s.png)
Android 资源 id详解及的动态获取
Android广播接收机制详细介绍(附短信接收实现)
Android仿QQ、微信聊天界面长按提示框效果
![](https://img.aspxhome.com/file/2023/8/122088_0s.jpg)
java开发线上事故理解RocketMQ异步精髓
![](https://img.aspxhome.com/file/2023/1/57501_0s.jpg)
Java 合并多个MP4视频文件
SpringBoot登录拦截配置详解(实测可用)
![](https://img.aspxhome.com/file/2023/5/106135_0s.png)