QT自定义QTextEdit实现大数据的实时刷新显示功能实例

作者:疯狂的挖掘机 时间:2023-05-06 03:18:28 

前言

最近使用QT中的QTextEdit控件,作为实时数据显示的UI,在一次写入超过多少k的时候循环写入则会卡顿,网上也没有什么好的解决方案,左思右想自己实现一个类似的demo。后期封装起来继承QWidget就可以在其他地方应用,直接上图:

QT自定义QTextEdit实现大数据的实时刷新显示功能实例

主要功能介绍:

1、这里用一个6M多的文件加一个定时器100ms模拟实时数据,可以 自定义保存多少数据,默认是保存10M数据;

2、行号的显示和隐藏;

3、右侧滚动条可以查看保存的数据;

4、支持大数据的保存实时刷新。

一、 思路

QT自带的QTextEdit在一次显示K以上级别的还是可以的,但是一次性读入上M数据基本上就会卡死,如果在实时监测数据,这个控件基本不能使用(少量数据是可以的)。目前的思路是分页显示:

QT自定义QTextEdit实现大数据的实时刷新显示功能实例

上述自定义的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

标签:qtablewidget,实时,刷新
0
投稿

猜你喜欢

  • JavaWeb Servlet生命周期细枝末节处深究

    2023-08-25 22:48:23
  • C#简单创建和删除目录的方法

    2022-04-17 00:31:58
  • C# WinForm创建Excel文件的实例

    2023-08-06 19:47:06
  • Java实现五子棋游戏

    2022-07-08 12:50:27
  • pom文件中${project.basedir}的使用

    2021-12-24 04:24:11
  • C#多线程处理多个队列数据的方法

    2021-12-26 19:31:02
  • C#使用log4net记录日志的方法步骤

    2021-07-07 18:14:55
  • MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)

    2023-11-16 16:34:23
  • Android 自定义组件成JAR包的实现方法

    2023-04-08 17:56:39
  • Java带复选框的树(Java CheckBox Tree)实现和应用

    2021-07-25 20:53:46
  • 详解Java面向对象编程之多态

    2023-08-28 19:17:06
  • Java用freemarker导出word实用示例

    2022-06-05 17:16:32
  • SpringSecurity Jwt Token 自动刷新的实现

    2022-04-28 18:49:45
  • Android 资源 id详解及的动态获取

    2023-06-25 00:32:21
  • Android广播接收机制详细介绍(附短信接收实现)

    2023-04-16 10:09:57
  • Android仿QQ、微信聊天界面长按提示框效果

    2023-06-11 14:04:32
  • java开发线上事故理解RocketMQ异步精髓

    2023-07-25 07:41:20
  • Java 合并多个MP4视频文件

    2022-08-23 12:09:19
  • SpringBoot登录拦截配置详解(实测可用)

    2023-04-22 20:52:21
  • C#图片切割、图片压缩、缩略图生成代码汇总

    2022-01-20 07:51:26
  • asp之家 软件编程 m.aspxhome.com