首页 > 其他分享 >QtableWidget插入数据卡顿优化方法

QtableWidget插入数据卡顿优化方法

时间:2023-04-16 16:12:21浏览次数:40  
标签:strStockCode pIterm tableWidgetHis QtableWidget 插入 QTableWidgetItem ui rownum 卡顿

最近要使用Qtablewidget保存4300多的数据,发现以下刷新4300条数据,界面会变得非常卡顿,于是想了优化一下;因为要对所有数据排序,想用一下Qtablewidget自动排序功能,而且数据量不多,不想采用动态加载的方式来实现;

方法1复用内存,不重复清除创建

以前每次都会清除,然后重新创建对象,写数据,发现重新pIterm = new QTableWidgetItem;非常耗时,导致界面卡顿;于是想复用已经创建的QTableWidgetItem,插入数据时,先获取Qtablewidget的item,直接在上面写数据;发现速度快了很多;

void QStockView::SlotUpdateHisDataTable(map<QString, HisAnalyzeInfo>& mapHisAnalyze)
{
    m_bUpdatingHisTable = true;
    //ui.tableWidgetHis->setUpdatesEnabled(false);
    //删除内容
    int RowCount = ui.tableWidgetHis->rowCount();
    /*while (rownum > 0)//删除重新插入比较耗时
    {
        ui.tableWidgetHis->removeRow(0);
        rownum--;
    }*/
    //ui.tableWidgetHis->setColumnCount(10);
    map<QString, HisAnalyzeInfo>::iterator it = mapHisAnalyze.begin();
    QTableWidgetItem* pIterm = NULL;
    
    int rownum = 0;
    //先插入已经存在的

    for (;it!= mapHisAnalyze.end();it++)
    {
        int colum = 0;
        if (RowCount>0)
        {
            //第0行是复选框,从1开始
            ui.tableWidgetHis->setRowHidden(rownum, false);
            colum = 1;
            pIterm = ui.tableWidgetHis->item(rownum,colum++);//代码
            if (pIterm != NULL)
            {
                QString strStockCode = it->second.strCode;
                strStockCode = strStockCode.right(6);
                pIterm->setText(strStockCode);
            }
            RowCount--;//可用行数减一
            
        }
        else//插入新的数据
        {

            ui.tableWidgetHis->insertRow(rownum);
            /*QCheckBox* pCheckBox = new QCheckBox();
            pCheckBox->setFixedWidth(20);
            pCheckBox->setChecked(false);
            ui.tableWidgetHis->setCellWidget(rownum, colum++, pCheckBox);*/
            pIterm = new QTableWidgetItem;
            pIterm->setCheckState(Qt::Unchecked);
            ui.tableWidgetHis->setItem(rownum, colum++, pIterm);
            pIterm = new QTableWidgetItem;
            if (pIterm != NULL)
            {
                QString strStockCode = it->second.strCode;
                strStockCode = strStockCode.right(6);
                pIterm->setText(strStockCode);
            }
        }
        rownum++;
    }
    if (RowCount > 0)//隐藏多余的行
    {
        for (int i=0;i<RowCount;i++)
        {
            ui.tableWidgetHis->setRowHidden(rownum+i,true);
        }
    }
    //Slotsortbyclounm(m_sortCloum);//隐藏和排序同时使用时会导致错乱,Qtablewidget->setRowHidden()将无效该隐藏的行没有隐藏;,所以这里注释掉 m_bUpdatingHisTable = false; }

(2)经过上述方法发现,当数据量是4000多时,虽然复用了内存空间,重新刷新一次也要十几秒的时间,而且界面会卡住无响应

原因竟然是第一列采用QCheckBox* pCheckBox = new QCheckBox();插入的复选框,导致刷新数据会非常卡,换成了QTableWidgetItem(pIterm = new QTableWidgetItem; pIterm->setCheckState(Qt::Unchecked))自带的checkbox功能后,用统一的QTableWidgetItem去写数据,不用自定义的widget去设置,速度会很快,4000多条数据1秒之后就加载完成,非常快。也不卡;

 遇到的问题

Qtablewidget->setRowHidden()之后紧跟排序Slotsortbyclounm(m_sortCloum),setRowHidden()将会无效,导致无法隐藏想要隐藏的行;可以考虑用信号槽去关联,或者等到隐藏结束,竖向滚动条的范围发生改变时,再去排序;
Slotsortbyclounm(m_sortCloum);//隐藏和排序同时使用时会导致错乱,Qtablewidget->setRowHidden()将无效该隐藏的行没有隐藏;,所以这里注释掉 m_bUpdatingHisTable = false; }

 如果对软件感兴趣,可维新共总好:QStockView 获取;

标签:strStockCode,pIterm,tableWidgetHis,QtableWidget,插入,QTableWidgetItem,ui,rownum,卡顿
From: https://www.cnblogs.com/bclshuai/p/17323422.html

相关文章

  • 宏碁S3修复看视频卡顿有残影,校准颜色
    看动画有残影:桌面右键-显示设置-缩放与布局-100% 估计看视频也会进行缩放,导致卡顿和残影,调到100%就不缩放了。 校正颜色:DC调光颜色对比有点问题,白的太白,黑的太黑,可以校正一下颜色。点这个显示设置下面的高级显示设置-显示适配器属性-颜色管理-高级-校准显示器,会出现校准......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描一次之后就可以确保最后一个元素位于正确的顺序,接着逐步进......
  • pdo 插入记录用?做占位符
    <?phpheader("Content-type:text/html;charset=utf-8");//设置中国时区date_default_timezone_set('PRC');$dsn="mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";$username="root";$password="root";......
  • 使用PDO插入记录
     <?phpheader("Content-type:text/html;charset=utf-8");//设置中国时区date_default_timezone_set('PRC');$dsn="mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";$username="root";$password="root"......
  • 排序算法-插入排序
    排序算法-插入排序1.直接插入排序InsertSort1.1InsertSort介绍InsertSort也是一种简单的内部排序算法,其是对待排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的,是一种稳定的排序算法。InserSort的基本思想是:将待排序序列看作一个有序表和一个无序表,初始时......
  • Three.js教程:3D场景中插入新的几何体
    推荐:将NSDT场景编辑器加入你3D工具链其他工具系列:NSDT简石数字孪生3D场景中插入新的几何体前面课程绘制了一个立方体效果,下面通过three.js的球体构造函数SphereGeometry()在三维场景中添加一个球几何体。SphereGeometry构造函数SphereGeometry(radius,widthSegments,height......
  • 在markdown中,如何使用html代码将多行的代码块插入到一行文字中
    这是一行文字,其中包含了一段多行的代码块:<codestyle="display:inline-block;">intmain(){printf("Hello,world!");return0;}</code>文字继续向下。效果如下:这是一行文字,其中包含了一段多行的代码块:intmain(){printf("Hello,world!");return0;}文字继续......
  • Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数
    场景Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、冒泡排序冒泡排序法又称为交换排序法,原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此扫描......
  • 一个事务插入,另外一个事务更新操作,是否会更新成功?
    1.前言同样另外一个非常有意思的题目,值得我们思考。大概背景是这个样子的。如果有一个事务A进行插入id>100,同时另外一个事务B进行更新updateid>100。那么事务B是否会更新成功。我们来画一个时序图:time事务A事务B备注T1insertid>100setstatus=1T......
  • Qt之QTableWidget的使用
    #ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QtWidgets>#include<QDebug>#include<QJsonArray>#include<QJsonObject>#include<QJsonValue>#include<QJsonDocument>#defineTABLE_HEADER_STYLE"QHeaderVie......