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

目录
  • 前言
  • 一、 思路
  • 二、关键部分代码
    • 1.缓存
    • 2.滚动部分代码
  • 三、需要优化的地方
  • 总结

前言

最近使用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、需要需要优化的部分翻页功能应该让右侧滑动条到最上或者最下自动去加载数据,可能体验更好;

总结

在实现功能之前,自己试验了好几种方法,包括多线程,后来发现时频繁的加载大数据界面才会卡死,UI交互部分在主线程操作,所以保证数据量在可视的范围就好,无需一次加载太多数据。

QT是个好的ide,目前已经6版本,支持更高级的C++和更好的特性,在应用方面还需要自己更具实际需要好好的揣摩。

到此这篇关于QT自定义QTextEdit实现大数据的实时刷新显示功能的文章就介绍到这了,更多相关QT自定义QTextEdit实时刷新显示内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyQt5高级界面控件之QTableWidget的具体使用方法

    前言 QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid.QTableWidget是QTableView的子类,它使用标准的数据模型,并且其单元数据是通过QTableWidgetItem对象来实现的,使用QTableWidget时就需要QTableWidgetItem.用来表示表格中的一个单元格,整个表格就是用各个单元格构建起来的 QTableWidget类中的常用方法 方法 描述 setROwCount(int row) 设置QTableWidget表

  • python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性

    QTableWidget介绍 QTableWidget是Qt程序中常用的显示数据表格的控件,类似于c#中的DataGrid.QTableWidget是QTableView的子类,它使用标准的数据模型,并且其单元数据是通过QTableWidgetItem对象来实现的,使用QTableWidget时就需要QTableWidgetItem.用来表示表格中的一个单元格,整个表格就是用各个单元格构建起来的 QTableWidget类中的常用方法 方法 描述 setROwCount(int row) 设置Q

  • Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区别

    QTableView是Qt中用来把数据集以表格形式提供给用户的一个控件 QTableView类实现表格视图,QTableView的数据由继承QAbstractItemModel的子类models来提供 #include<QStandardItemModel> QStandardItemModel *model = new QStandardItemModel(); ui->tableView->setModel(model); 一.添加表头: model->setColumn

  • Qt QTableWidget基本操作及使用

    目录 界面设计与初始化 QTableWidget 基本操作 设置表头 初始化表格数据 获得当前单元格数据 插入.添加.删除行 其他属性控制 遍历表格读取数据 QTableWidget 是 Qt 中的表格组件类.在窗体上放置一个 QTableWidget 组件后,可以在 Property Editor 里对其进行属性设置,双击这个组件,可以打开一个编辑器,对其 Colum.Row 和 Item 进行编辑. 一个 QTableWidget 组件的界面基本结构如图 1 所示,这个表格设置为 6 行 5

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

    目录 前言 一. 思路 二.关键部分代码 1.缓存 2.滚动部分代码 三.需要优化的地方 总结 前言 最近使用QT中的QTextEdit控件,作为实时数据显示的UI,在一次写入超过多少k的时候循环写入则会卡顿,网上也没有什么好的解决方案,左思右想自己实现一个类似的demo.后期封装起来继承QWidget就可以在其他地方应用,直接上图: 主要功能介绍: 1.这里用一个6M多的文件加一个定时器100ms模拟实时数据,可以 自定义保存多少数据,默认是保存10M数据: 2.行号的显示和隐藏: 3.右侧滚

  • php+ajax实时刷新简单实例

    本文实例讲述了php+ajax实时刷新简单实现方法,分享给大家供大家参考.具体如下: ajax自动刷新好像是个很常见的问题,之前做一个网页聊天室程序也是卡在了这上面,经过了这段时间的学习,终于做出了一个可以自动刷新网页的代码框架,希望正在迷茫的亲们不要像我一样走了这么多弯路 废话不多说 上代码: html部分: <html> <head> <script type="text/javascript"> function loadXMLDoc()//a

  • uni-app实现数据下拉刷新功能实例

    目录 uni-app数据下拉刷新 附:uni.startPullDownRefresh(OBJECT) 总结 uni-app上拉加载更多功能:https://www.jb51.net/article/257733.htm uni-app数据下拉刷新 在 pages.json 配置文件中,为当前的 goods_list 页面单独开启下拉刷新效果: "subPackages": [{ "root": "subpkg", "pages&quo

  • 在ASP.NET 2.0中操作数据之二十五:大数据量时提高分页的效率

    导言 如我们在之前的教程里讨论的那样,分页可以通过两种方法来实现: 1.默认分页– 你仅仅只用选中data Web control的 智能标签的Enable Paging ; 然而,当你浏览页面的时候,虽然你看到的只是一小部分数据,ObjectDataSource 还是会每次都读取所有数据 2.自定义分页– 通过只从数据库读取用户需要浏览的那部分数据,提高了性能. 显然这种方法需要你做更多的工作. 默认的分页功能非常吸引人,因为你只需要选中一个checkbox就可以完成了.但是它每次都读取所有的

  • Vue+WebSocket页面实时刷新长连接的实现

    最近vue项目要做数据实时刷新,折线图每秒重画一次,数据每0.5秒刷新一次,说白了就是实时刷新,因为数据量较大,用定时器估计页面停留一会就会卡死... 与后台人员讨论过后决定使用h5新增的WebSocket来实现数据实时展示,记录一下过程以及碰到的问题: 注意:页面刷新长连接会被关闭,其实进入当前页面建立长连接的目的就是页面不用F5刷新,所有数据自动实时刷新,如果还是来回F5大刷页面那就没有意义了... ps: 如果实在有这个需求的话,网上貌似有实现刷新页面长连接不断的方法,请自行百度....

  • eBay 打造基于 Apache Druid 的大数据实时监控系统

    首先需要注意的是,本文即将提到的 Druid,并非阿里巴巴的 Druid 数据库连接池,而是另一个大数据场景下的解决方案:Apache Druid. Apache Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式时序数据库系统,旨在快速处理大规模的数据,并能够实现快速查询和分析.尤其是当发生代码部署.机器故障以及其他产品系统遇到宕机等情况时,Druid 仍能够保持 100% 正常运行.创建 Druid 的最初意图主要是为了解决查询延迟问题,当时试图使用 Hadoop 来实现交

  • Qt自定义Plot实现曲线绘制的详细过程

    简介 实现了qt绘制曲线功能,包含arm触摸屏多点触控缩放(只支持两点),实时曲线绘制,数据点根据绘制宽度优化,跟踪点数据获取,双坐标等功能 演示 代码 头文件 plot.h /* * 作者:老人与海 * 博客:https://blog.csdn.net/qq_41340733 * 代码不保证稳定性,请勿用于商业用途 */ #ifndef PLOT_H #define PLOT_H #include <QWidget> #include <QTimer> #include <

  • vue watch自动检测数据变化实时渲染的方法

    本文介绍了vue watch自动检测数据变化实时渲染的方法,分享给大家,具体如下: 首先确认 watch是一个对象,一定要当成对象来用. 对象就有键,有值. 键:就是你要监控的那个家伙,比如说$route,这个就是要监控路由的变化.或者是data中的某个变量. 值可以是函数:就是当你监控的家伙变化时,需要执行的函数,这个函数有两个形参,第一个是当前值,第二个是变化后的值. 值也可以是函数名:不过这个函数名要用单引号来包裹. 第三种情况厉害了. 值是包括选项的对象:选项包括有三个. 第一个hand

  • 解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)

    一.在我们使用vue进行开发的过程中,可能会遇到一种情况: 当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去: 向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新.它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 ,需要用vue内置的方法 二.Vue.set() 响应式新增与修改数据 此时我们需要知道Vue.set()需要哪些参数,官方API:https://cn.vuejs.org/v2/api/#Vue-set 调用方法:

  • Sqlserver 高并发和大数据存储方案

    随着用户的日益递增,日活和峰值的暴涨,数据库处理性能面临着巨大的挑战.下面分享下对实际10万+峰值的平台的数据库优化方案.与大家一起讨论,互相学习提高! 案例:游戏平台. 1.解决高并发 当客户端连接数达到峰值的时候,服务端对连接的维护与处理这里暂时不做讨论.当多个写请求到数据库的时候,这时候需要对多张表进行插入,尤其一些表 达到每天千万+的存储,随着时间的积累,传统的同步写入数据的方式显然不可取,经过试验,通过异步插入的方式改善了许多,但与此同时,对读取数据的实时性也需要做一定的牺牲. 异步的

随机推荐